Hi Forrest,
In addition to the official doc about domain at:
http://nodejs.org/api/domain.html
i came across
https://github.com/joyent/node/blob/master/test/simple/test-domain-nested-throw.js
which does not really help me much.
i am enormously grateful for your insightful explanation and reference
pointers. Now it's time for me to get my hands muddy and dig a little
deeper, :-)
On Monday, March 31, 2014 1:21:14 AM UTC-4, Forrest L Norvell wrote:
>
> The closest thing to documentation of the implementation is the
> implementation itself, but as that's scattered across a whole bunch of
> source files, it's not too useful.
>
> Here are some semi-organized notes in lieu of actual documentation:
>
> - There are no modifications to V8 for domains. src/node.cc was
> modified in Node 0.10 to have a new global exception-handler that the
> domain system can hook into, which replaces
> process.on('uncaughtException'). Node 0.12 will have some further
> changes to the C++ side of Node (mostly related to the new, still-private
> asyncListener API), but even still, they don't reach into the V8 codebase.
> Node just consumes the V8 embedding API; with some very rare exceptions,
> it
> doesn't touch V8's internals at all.
> - The changes to Node are primarily in two categories:
> 1. To ensure the domain is properly propagated across asynchronous
> call stacks.
> 2. To ensure that EventEmitters created and run inside domains are
> attached to the correct domain.
> - The original implementation of domains, from Node 0.8, was built
> atop process.on('uncaughtException'). Trevor Norris reworked it fairly
> heavily for Node 0.10, making changes all the way down to the C++ level,
> in
> the interest of reducing the overhead imposed by domains. In particular,
> he
> bifurcated the code paths used for the Node event loop so there are
> separate versions for when domains aren't / are in use. Requiring the
> domains module switches between the two paths, essentially making domains
> free when you're not using them.
> - Even with Trevor's changes, the vast bulk of the domain API is
> implemented in pure JavaScript, in src/node.js, lib/domain.js, and
> lib/events.js.
> - The basic mechanism is pretty simple: take the function provided to
> d.run() or d.bind(), wrap it in a closure, make calls to d.enter() and
> d.exit() before and after running the function when the closure is
> invoked. All the other mechanisms are there to ensure that the correct
> domain is available across asynchronous boundaries in case of errors.
> - The trickiest bits to understand are all of the implicit bindings
> that happen around EventEmitters / Sockets / HTTP requests and responses
> and domains. It's convenient in that you don't have to remember to add all
> these EEs to the domain, but there's some subtle stuff going on.
> - Probably the most counterintuitive part of domains' implementation
> is the way nested domains interact -- if you enter a domain from inside a
> domain, and then exit the containing domain, the contained domain will be
> exited as well. This is similar to how try / catch / finally deals with
> the
> call stack in the synchronous case, but it may not be what you expect.
>
> The rest of the details can be figured out from reading the source
> (although, especially in 0.10, it may take a few readthroughs before
> everything starts to come together). I've suggested writing some design
> documents to capture some of these details, and there was general agreement
> that that would be useful, but somebody's gotta find the time to write all
> this stuff down, and nobody's done it (yet).
>
> Hope this is helpful!
>
> F
>
>
> On Sun, Mar 30, 2014 at 8:27 PM, ming <[email protected] <javascript:>>wrote:
>
>> Hi,
>> Do you know of any documentation(s) about how domains are implemented in
>> Node.js? In particular, what changes were introduced in Node.js and the
>> underlying Google V8 engine (if any) for the implementation of domains?
>>
>> Thanks.
>>
>>
>> --
>> --
>> Job Board: http://jobs.nodejs.org/
>> Posting guidelines:
>> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
>> You received this message because you are subscribed to the Google
>> Groups "nodejs" group.
>> To post to this group, send email to [email protected]<javascript:>
>> To unsubscribe from this group, send email to
>> [email protected] <javascript:>
>> For more options, visit this group at
>> http://groups.google.com/group/nodejs?hl=en?hl=en
>>
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "nodejs" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
--
--
Job Board: http://jobs.nodejs.org/
Posting guidelines:
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en
---
You received this message because you are subscribed to the Google Groups
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.