Make setImmediate have the same side effect with upstream node.
authorCheng Zhao <zcbenz@gmail.com>
Sun, 15 Dec 2013 11:09:00 +0000 (19:09 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Sun, 15 Dec 2013 11:09:00 +0000 (19:09 +0800)
renderer/lib/init.coffee

index f481146..5265b4d 100644 (file)
@@ -22,9 +22,19 @@ globalPaths.push path.join(process.resourcesPath, 'app')
 # Expose global variables.
 global.require = require
 global.module = module
-global.setImmediate = ->
-  process.activateUvLoop()
-  timers.setImmediate.apply this, arguments
+
+# setImmediate and process.nextTick makes use of uv_check and uv_prepare to
+# run the callbacks, however since we only run uv loop on requests, the
+# callbacks wouldn't be called until something else activated the uv loop,
+# which would delay the callbacks for arbitrary long time. So we should
+# initiatively activate the uv loop once setImmediate and process.nextTick is
+# called.
+wrapWithActivateUvLoop = (func) ->
+  ->
+    process.activateUvLoop()
+    func.apply this, arguments
+process.nextTick = wrapWithActivateUvLoop process.nextTick
+global.setImmediate = wrapWithActivateUvLoop timers.setImmediate
 global.clearImmediate = timers.clearImmediate
 
 # Set the __filename to the path of html file if it's file:// protocol.