process: remove maxTickDepth from _tickCallback
authorTrevor Norris <trev.norris@gmail.com>
Wed, 29 May 2013 22:19:34 +0000 (15:19 -0700)
committerTrevor Norris <trev.norris@gmail.com>
Thu, 30 May 2013 16:30:19 +0000 (09:30 -0700)
Removes the check for maxTickDepth for non-domain callbacks. So a user
can starve I/O by setting a recursive nextTick.

The domain case is more complex and will be addressed in another commit.

src/node.cc
src/node.js
test/message/max_tick_depth.out
test/message/max_tick_depth_trace.js [deleted file]
test/message/max_tick_depth_trace.out [deleted file]
test/simple/test-next-tick-starvation.js [deleted file]

index 9688328..17d9c1f 100644 (file)
@@ -1029,7 +1029,6 @@ MakeCallback(const Handle<Object> object,
 
   if (tick_infobox.length == 0) {
     tick_infobox.index = 0;
-    tick_infobox.depth = 0;
     return ret;
   }
 
index bfbf47f..7f84f49 100644 (file)
       if (inTick) return;
       if (infoBox[length] === 0) {
         infoBox[index] = 0;
-        infoBox[depth] = 0;
         return;
       }
       inTick = true;
 
-      while (infoBox[depth]++ < process.maxTickDepth) {
-        nextTickLength = infoBox[length];
-        if (infoBox[index] === nextTickLength)
-          return tickDone(0);
-
-        while (infoBox[index] < nextTickLength) {
-          callback = nextTickQueue[infoBox[index]++].callback;
-          threw = true;
-          try {
-            callback();
-            threw = false;
-          } finally {
-            if (threw) tickDone(infoBox[depth]);
-          }
+      while (infoBox[index] < infoBox[length]) {
+        callback = nextTickQueue[infoBox[index]++].callback;
+        threw = true;
+        try {
+          callback();
+          threw = false;
+        } finally {
+          if (threw) tickDone(0);
         }
       }
 
       // on the way out, don't bother. it won't get fired anyway.
       if (process._exiting)
         return;
-      if (infoBox[depth] >= process.maxTickDepth)
-        maxTickWarn();
 
       var obj = { callback: callback, domain: null };
 
index f285484..7f6c3e7 100644 (file)
@@ -8,7 +8,6 @@ tick 14
 tick 13
 tick 12
 tick 11
-(node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.
 tick 10
 tick 9
 tick 8
@@ -19,5 +18,4 @@ tick 4
 tick 3
 tick 2
 tick 1
-(node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.
 tick 0
diff --git a/test/message/max_tick_depth_trace.js b/test/message/max_tick_depth_trace.js
deleted file mode 100644 (file)
index e58d04b..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var common = require('../common');
-
-process.maxTickDepth = 10;
-process.traceDeprecation = true;
-var i = 20;
-process.nextTick(function f() {
-  console.error('tick %d', i);
-  if (i-- > 0)
-    process.nextTick(f);
-});
diff --git a/test/message/max_tick_depth_trace.out b/test/message/max_tick_depth_trace.out
deleted file mode 100644 (file)
index 22184a6..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-tick 20
-tick 19
-tick 18
-tick 17
-tick 16
-tick 15
-tick 14
-tick 13
-tick 12
-tick 11
-Trace: (node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.
-    at maxTickWarn (node.js:*:*)
-    at process.nextTick (node.js:*:*)
-    at f (*test*message*max_tick_depth_trace.js:*:*)
-    at process._tickCallback (node.js:*:*)
-    at Function.Module.runMain (module.js:*:*)
-    at startup (node.js:*:*)
-    at node.js:*:*
-tick 10
-tick 9
-tick 8
-tick 7
-tick 6
-tick 5
-tick 4
-tick 3
-tick 2
-tick 1
-Trace: (node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.
-    at maxTickWarn (node.js:*:*)
-    at process.nextTick (node.js:*:*)
-    at f (*test*message*max_tick_depth_trace.js:*:*)
-    at process._tickCallback (node.js:*:*)
-    at process._tickFromSpinner (node.js:*:*)
-tick 0
diff --git a/test/simple/test-next-tick-starvation.js b/test/simple/test-next-tick-starvation.js
deleted file mode 100644 (file)
index bf678a0..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var common = require('../common');
-var assert = require('assert');
-
-
-var ran = false;
-var stop = false;
-var start = +new Date();
-
-function spin() {
-  var now = +new Date();
-  if (now - start > 100) {
-    throw new Error('The timer is starving');
-  }
-
-  if (!stop) {
-    ran = true;
-    process.nextTick(spin);
-  }
-}
-
-function onTimeout() {
-  stop = true;
-}
-
-spin();
-setTimeout(onTimeout, 50);
-
-process.on('exit', function() {
-  assert.ok(ran);
-  assert.ok(stop);
-});