Skip to content

Instantly share code, notes, and snippets.

@metamatt
Last active August 29, 2015 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save metamatt/2465dfd76213a98e22e0 to your computer and use it in GitHub Desktop.
Save metamatt/2465dfd76213a98e22e0 to your computer and use it in GitHub Desktop.
Demo of the call stacks you get from console.trace for a few scenarios involving node-fibers.
'use strict';
var Fiber = require('fibers');
var Future = require('fibers/future');
function test() {
console.trace('trace from root non-fiber');
// Create fiber explicitly, the low-level way.
var f1 = Fiber(function fiber1() {
console.trace('trace from inside fiber 1 before yield');
Fiber.yield();
console.trace('trace from inside fiber 1 after yield');
});
f1.run();
// That runs till first Fiber.yield call, then lands here
console.trace('trace from root non-fiber');
f1.run(); // run it again till it exits
console.trace('trace from root non-fiber');
// Create fiber via FiberFuture (patched onto Function.prototype).
var fiberFutureCtor = function fiber2() {
console.trace('trace from inside fiber 2');
}.future();
// Invoking the future causes it to do Fiber.run deferred via nextTick.
var fiberFuture = fiberFutureCtor();
console.trace('trace from root non-fiber before fiber 2 starts');
fiberFuture.resolve(function resolver() {
console.trace('trace from fiber 2 resolver while exiting');
process.nextTick(function getOutOfFiber() {
console.trace('trace from root non-fiber after fiber 2 exited');
});
});
}
// Invoke test via nextTick via setTimeout, to keep node's startup
// code (Module.runMain, Module.load, etc) out of the stack traces.
// This shouldn't affect the actual behavior; it's just easier to
// read the less cluttered stack traces, and is also more like the
// steady state of a real app that runs for more than 0 ticks before
// doing work.
setTimeout(function() {
process.nextTick(test);
});
magi@ubuntu ~> node fiberStacks.js
Trace: trace from root non-fiber
at test (/home/magi/src/demeterr/experiments/fiberStacks.js:8:12)
at process._tickCallback (node.js:415:13)
Trace: trace from inside fiber 1 before yield
at fiber1 (/home/magi/src/demeterr/experiments/fiberStacks.js:11:15)
Trace: trace from root non-fiber
at test (/home/magi/src/demeterr/experiments/fiberStacks.js:17:12)
at process._tickCallback (node.js:415:13)
Trace: trace from inside fiber 1 after yield
at fiber1 (/home/magi/src/demeterr/experiments/fiberStacks.js:13:15)
Trace: trace from root non-fiber
at test (/home/magi/src/demeterr/experiments/fiberStacks.js:19:12)
at process._tickCallback (node.js:415:13)
Trace: trace from root non-fiber before fiber 2 starts
at test (/home/magi/src/demeterr/experiments/fiberStacks.js:27:12)
at process._tickCallback (node.js:415:13)
Trace: trace from inside fiber 2
at fiber2 (/home/magi/src/demeterr/experiments/fiberStacks.js:23:15)
at /home/magi/src/demeterr/experiments/node_modules/fibers/future.js:344:21
Trace: trace from fiber 2 resolver while exiting
at Array.resolver [as 0] (/home/magi/src/demeterr/experiments/fiberStacks.js:29:15)
at FiberFuture.Future.return (/home/magi/src/demeterr/experiments/node_modules/fibers/future.js:168:13)
at /home/magi/src/demeterr/experiments/node_modules/fibers/future.js:344:17
Trace: trace from root non-fiber after fiber 2 exited
at getOutOfFiber (/home/magi/src/demeterr/experiments/fiberStacks.js:31:18)
at process._tickCallback (node.js:415:13)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment