[Win] Poll events with GetQueuedCompletionStatus, fixes #41.
authorCheng Zhao <zcbenz@gmail.com>
Tue, 23 Jul 2013 11:19:11 +0000 (19:19 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Tue, 23 Jul 2013 11:19:11 +0000 (19:19 +0800)
common/node_bindings_win.cc

index 6cfa12c..f9177d7 100644 (file)
@@ -7,8 +7,11 @@
 #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 {
 
@@ -20,7 +23,37 @@ NodeBindingsWin::~NodeBindingsWin() {
 }
 
 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