`node --vars` no longer does anything. It doesn't seem like this is coming back as there's radio silence on joyent/node#1536 and 0.5.5 has been tagged with the missing flag. This is just a build tweak to pull installation information from the `process` object inside of node.
If for some reason UCONTEXT and SJLJ don't work, you can change the CORO_WHATEVER definition in src/platform.mk to CORO_PTHREAD and it will use pthreads and pthread_cond_wait to simulate fibers which should be pretty resilient against v8 changes. This isn't being used for now but it only needed a few hooks to get this compatibility in.
The wrapper script is no longer needed because we're not depending on any LD_PRELOAD magic anymore. A few build peculiarities had to be taken care of, and the bootstrapping in coroutine.cc was changed slightly. Also SJLJ in libcoro seems to hang on Linux for me, so I'm specifying UCONTEXT (old method) for Linux builds now.
In v8:r7575 (tagged at 3.2.10) v8 changed their internal mechanism for detecting context changes. Instead of using pthread_self() they are now using pthread_getspecific(). Ultimately this makes it considerably easier to build fibers into v8, but the current method is broken. Node updated v8 from 3.1.8 to 3.4.8 in e5564a3f (tagged at 0.5.2). Thus, this version of fibers only works on version of node <= 0.5.1.
ucontext in Lion is straight up buggy. These functions have been marked as deprecated for a while so it's not totally surprising, but still ridic. libcoro has implemented a very similar API using setjmp and longjmp internally (among other configurable backends). Switching over to setjmp\longjmp, along with the pthread* hook changes fixes fiber support in Lion. Closes gh-28
The approach from the last commit wasn't totally good enough. It seems v8 implements "fast TLS" in some cases which uses inline assembly to get at thread locals and there's no way we can hook this. But this is only being used for Isolates so they don't need to be fiber-specific. To solve the problem when setting a local in FLS it also sets the local in FLS. ** This means that in fibers GetExistingThreadLocal and GetThreadLocal will have conflicting results ** but so far I haven't had any problems.
dlsym() in Lion now calls pthread_key_create() which breaks an assumption coroutine.cc had made, causing infinite recursion. This modifies the primordial pthread hooks to work under the new constraints. This fix isn't complete as there is still segfaulting I haven't quite tracked down yet.
node's debugger is built as a node process which spawns another node process. There was an issue where the spawned node process (which runs the client code) was not getting shimmed, because coroutine.cc attempts to clean up its environment. So I moved the environment cleanup code to fibers.js which actually simplified some of the logic there. Closes gh-25
This change makes it easier to use node-fibers with node-supervisor, or any other tool that monitors the health of the node process. It also results in a simpler process structure, and makes "node-fibers" closer to a true drop-in replacement for "node".
If multiple fibers finished one after in an unexpected way there would be a memory leak because `delete_me` would get overwritten. There was an assertion in place to prevent this scenario, and a case was discovered which triggers this condition. It was actually quite hard to hit because the coroutine pool masks this issue very well. The issue was fixed by deleting dead coroutines as soon as possible, instead of at the next call to run() Closes gh-16