From 67fdec20726e48ba3a934cb25bb30d47ec4a4f29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yaroslav=20De=20La=20Pe=C3=B1a=20Smirnov?= Date: Wed, 29 Nov 2017 11:44:34 +0300 Subject: Initial commit, version 0.5.3 --- node_modules/uws/src/Epoll.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 node_modules/uws/src/Epoll.cpp (limited to 'node_modules/uws/src/Epoll.cpp') diff --git a/node_modules/uws/src/Epoll.cpp b/node_modules/uws/src/Epoll.cpp new file mode 100644 index 0000000..f78d2ba --- /dev/null +++ b/node_modules/uws/src/Epoll.cpp @@ -0,0 +1,60 @@ +#include "Backend.h" + +#ifdef USE_EPOLL + +// todo: remove this mutex, have callbacks set at program start +std::recursive_mutex cbMutex; +void (*callbacks[16])(Poll *, int, int); +int cbHead = 0; + +void Loop::run() { + timepoint = std::chrono::system_clock::now(); + while (numPolls) { + for (std::pair c : closing) { + numPolls--; + + c.second(c.first); + + if (!numPolls) { + closing.clear(); + return; + } + } + closing.clear(); + + int numFdReady = epoll_wait(epfd, readyEvents, 1024, delay); + timepoint = std::chrono::system_clock::now(); + + if (preCb) { + preCb(preCbData); + } + + for (int i = 0; i < numFdReady; i++) { + Poll *poll = (Poll *) readyEvents[i].data.ptr; + int status = -bool(readyEvents[i].events & EPOLLERR); + callbacks[poll->state.cbIndex](poll, status, readyEvents[i].events); + } + + while (timers.size() && timers[0].timepoint < timepoint) { + Timer *timer = timers[0].timer; + cancelledLastTimer = false; + timers[0].cb(timers[0].timer); + + if (cancelledLastTimer) { + continue; + } + + int repeat = timers[0].nextDelay; + auto cb = timers[0].cb; + timers.erase(timers.begin()); + if (repeat) { + timer->start(cb, repeat, repeat); + } + } + + if (postCb) { + postCb(postCbData); + } + } +} +#endif -- cgit v1.2.3