From 0761c90204d7a0134c657e20f91bd83bfa6e677a Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Wed, 29 May 2013 15:19:34 -0700 Subject: [PATCH] process: remove maxTickDepth from _tickCallback 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 | 1 - src/node.js | 25 ++++-------- test/message/max_tick_depth.out | 2 - test/message/max_tick_depth_trace.js | 31 -------------- test/message/max_tick_depth_trace.out | 35 ---------------- test/simple/test-next-tick-starvation.js | 52 ------------------------ 6 files changed, 8 insertions(+), 138 deletions(-) delete mode 100644 test/message/max_tick_depth_trace.js delete mode 100644 test/message/max_tick_depth_trace.out delete mode 100644 test/simple/test-next-tick-starvation.js diff --git a/src/node.cc b/src/node.cc index 968832825f4..17d9c1f9692 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1029,7 +1029,6 @@ MakeCallback(const Handle object, if (tick_infobox.length == 0) { tick_infobox.index = 0; - tick_infobox.depth = 0; return ret; } diff --git a/src/node.js b/src/node.js index bfbf47fce67..7f84f4980c8 100644 --- a/src/node.js +++ b/src/node.js @@ -398,25 +398,18 @@ 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); } } @@ -476,8 +469,6 @@ // 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 }; diff --git a/test/message/max_tick_depth.out b/test/message/max_tick_depth.out index f2854845084..7f6c3e78b3b 100644 --- a/test/message/max_tick_depth.out +++ b/test/message/max_tick_depth.out @@ -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 index e58d04b41ca..00000000000 --- a/test/message/max_tick_depth_trace.js +++ /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 index 22184a69119..00000000000 --- a/test/message/max_tick_depth_trace.out +++ /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 index bf678a06463..00000000000 --- a/test/simple/test-next-tick-starvation.js +++ /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); -});