#include <windows.h>
#include "base/logging.h"
-#include "vendor/node/src/node.h"
-#include "vendor/node/src/node_internals.h"
+
+extern "C" {
+#include "vendor/node/deps/uv/include/uv-private/ngx-queue.h"
+#include "vendor/node/deps/uv/src/win/internal.h"
+}
namespace atom {
}
void NodeBindingsWin::PollEvents() {
- Sleep(50);
+ // Unlike Unix, in which we can just rely on one backend fd to determine
+ // whether we should iterate libuv loop, on Window, IOCP is just one part
+ // of the libuv loop, we should also check whether we have other types of
+ // events.
+ bool block = uv_loop_->idle_handles == NULL &&
+ uv_loop_->pending_reqs_tail == NULL &&
+ uv_loop_->endgame_handles == NULL &&
+ !uv_loop_->stop_flag &&
+ (uv_loop_->active_handles > 0 ||
+ !ngx_queue_empty(&uv_loop_->active_reqs));
+
+ // When there is no other types of events, we block on the IOCP.
+ if (block) {
+ DWORD bytes, timeout;
+ ULONG_PTR key;
+ OVERLAPPED* overlapped;
+
+ timeout = uv_get_poll_timeout(uv_loop_);
+ GetQueuedCompletionStatus(uv_loop_->iocp,
+ &bytes,
+ &key,
+ &overlapped,
+ timeout);
+
+ // Give the event back so libuv can deal with it.
+ if (overlapped != NULL)
+ PostQueuedCompletionStatus(uv_loop_->iocp,
+ bytes,
+ key,
+ overlapped);
+ }
}
// static