Wow, great! Lot of thanks! C уважением, Александр Лозовюк CTO at TRData Limited Alpha-Beta-Release Blog
http://abrdev.com https://trdata.com 2014-03-31 8:21 GMT+03:00 Forrest Norvell <[email protected]>: > 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: > > To ensure the domain is properly propagated across asynchronous call stacks. > 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]> 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] >> 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. > > > -- > -- > 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. -- -- 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.
