diff -r e60330fab5fe js/src/jscntxt.cpp --- a/js/src/jscntxt.cpp Sun Jun 07 09:32:19 2009 +0300 +++ b/js/src/jscntxt.cpp Mon Jun 22 17:09:12 2009 +0300 @@ -192,16 +192,17 @@ js_InitContextThread(JSContext *cx) * Another thread cannot initialize entry->thread. * JS_ASSERT(!entry->thread); entry->thread = thread; } JS_APPEND_LINK(&cx->threadLinks, &thread->contextList); cx->thread = thread; + JS_UNLOCK_GC(rt); return true; } void js_ClearContextThread(JSContext *cx) { JS_ASSERT(CURRENT_THREAD_IS_ME(cx->thread)); JS_REMOVE_AND_INIT_LINK(&cx->threadLinks);
Let's review the patch, from the header, we see that we're in js_InitContextThread - cool.
Can we read the file to see how it should work?
Let's
391 if (!js_InitContextThread(cx)) { 392 FreeContext(cx); 393 return NULL; 394 } ... 397 /* 398 * Here the GC lock is still held after js_InitContextThread took it and 399 * the GC is not running on another thread.
The monkey was unlocking something which was intentionally locked for the success case.