aboutsummaryrefslogtreecommitdiffhomepage
path: root/node_modules/uws/src/Epoll.cpp
diff options
context:
space:
mode:
authorYaroslav De La Peña Smirnov <yaros.rus_89@live.com.mx>2017-11-29 11:44:34 +0300
committerYaroslav De La Peña Smirnov <yaros.rus_89@live.com.mx>2017-11-29 11:44:34 +0300
commit67fdec20726e48ba3a934cb25bb30d47ec4a4f29 (patch)
tree37fd9f4f0b0c20103e1646fc83021e4765de3680 /node_modules/uws/src/Epoll.cpp
downloadspanish-checkers-67fdec20726e48ba3a934cb25bb30d47ec4a4f29.tar.gz
spanish-checkers-67fdec20726e48ba3a934cb25bb30d47ec4a4f29.zip
Initial commit, version 0.5.3
Diffstat (limited to 'node_modules/uws/src/Epoll.cpp')
-rw-r--r--node_modules/uws/src/Epoll.cpp60
1 files changed, 60 insertions, 0 deletions
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<Poll *, void (*)(Poll *)> 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