Closed
Bug 413097
Opened 17 years ago
Closed 17 years ago
JSGC_BEGIN callback can be invoked while rt->gcLock held
Categories
(Core :: JavaScript Engine, defect, P1)
Core
JavaScript Engine
Tracking
()
RESOLVED
FIXED
mozilla1.9beta3
People
(Reporter: brendan, Assigned: brendan)
References
Details
Attachments
(3 files, 1 obsolete file)
4.09 KB,
patch
|
shaver
:
review+
brendan
:
approval1.9+
|
Details | Diff | Splinter Review |
4.81 KB,
patch
|
Details | Diff | Splinter Review | |
3.74 KB,
text/plain
|
Details |
This leads to self-lock pretty directly:
#0 0x9002493f in semaphore_wait_trap ()#1 0x9000158f in pthread_mutex_lock ()#2 0x20019f27 in PR_Lock (lock=0x1137890) at ptsynch.c:206
#3 0x23018132 in js_ContextIterator (rt=0x1819a00, unlocked=1, iterp=0xbfffc1dc) at jscntxt.c:495#4 0x23001345 in JS_ContextIterator (rt=0x1819a00, iterp=0xbfffc1dc) at jsapi.c:1038#5 0x19ec7e2b in XPCJSRuntime::UnsetContextGlobals (this=0x1138860) at xpcjsruntime.cpp:452
#6 0x19ea4df5 in XPCCycleCollectGCCallback (cx=0x1137b00, status=JSGC_BEGIN) at nsXPConnect.cpp:458#7 0x2303c16c in js_GC (cx=0x1137b00, gckind=GC_LOCK_HELD) at jsgc.c:2442
#8 0x2305ae86 in js_SetProtoOrParent (cx=0x1137b00, obj=0x1f70e1a0, slot=0, pobj=0x1b2c8060) at jsobj.c:294
This stack shows a new call to js_GC with rt->gcLock held, at frame 8, from the patch I'm working on for bug 365851, but the same thing could happen in the last ditch case where js_NewGCThing finds no memory available and calls js_GC with rt->gcLock held.
/be
Comment 1•17 years ago
|
||
Hmm, tricky. We need to make sure we only call UnsetContextGlobals/ResetContextGlobals once, probably ignoring it in nested calls to XPCCycleCollectGCCallback. Could new JSContexts be created during the "outer" js_GC but before the nested call to js_GC?
Comment 2•17 years ago
|
||
Matching blocking1.9 status with blocked bug 365851
Flags: blocking1.9+
Priority: -- → P1
Assignee | ||
Updated•17 years ago
|
Status: NEW → ASSIGNED
Assignee | ||
Comment 3•17 years ago
|
||
This is as good as it gets, I'm afraid. JSGC_BEGIN is normally called without rt->gcLock held, and it can race among threads. Gecko uses it only to veto GC attempts on non-main threads, which is a static thread-id comparison against the current thread's id.
/be
Attachment #300256 -
Flags: review?(shaver)
Comment 4•17 years ago
|
||
Comment on attachment 300256 [details] [diff] [review]
simple racy fix, same guarantees as before and no selflock
r-, new patch coming with safer sampling of rt->gcCallback.
Attachment #300256 -
Flags: review?(shaver) → review-
Assignee | ||
Comment 5•17 years ago
|
||
Attachment #300256 -
Attachment is obsolete: true
Attachment #300261 -
Flags: review?(shaver)
Comment 6•17 years ago
|
||
Comment on attachment 300261 [details] [diff] [review]
better fix, thanks to shaver
r=shaver.
Attachment #300261 -
Flags: review?(shaver) → review+
Assignee | ||
Updated•17 years ago
|
Attachment #300261 -
Flags: approval1.9+
Assignee | ||
Comment 7•17 years ago
|
||
Fixed:
js/src/jsapi.c 3.397
js/src/jsgc.c 3.265
/be
Status: ASSIGNED → RESOLVED
Closed: 17 years ago
Resolution: --- → FIXED
Assignee | ||
Comment 8•17 years ago
|
||
Ahem:
$ cvs log -r3.266 jsgc.c
[...]
revision 3.266
date: 2008/01/30 05:12:45; author: brendan%mozilla.org; state: Exp; lines: +2 -2
Oops.
=============================================================================
$ cvs log -r3.267 jsgc.c
[...]
revision 3.267
date: 2008/01/30 05:14:55; author: brendan%mozilla.org; state: Exp; lines: +2 -2
Dammit.
/be
Comment 9•17 years ago
|
||
I'm just recording this patch here as the "reversal" patch for the changes documented in this bug, as I am testing its removal in response to bug 415393 comment 8. Results soon.
Comment 10•17 years ago
|
||
This is the result of backing out the patch in this bug, for SunSpider. I think overall, it's pretty much a wash, assuming I did the backout patch correctly.
Assignee | ||
Comment 11•17 years ago
|
||
Smart money (shaver and me, at any rate) says its bug 414452 that dinged in-browser-only SS perf -- but we can get that back by fixing bug 408871 and (if necessary) making JS_SetPrototype not to cycle detection unless #ifdef DEBUG.
/be
Updated•17 years ago
|
Flags: in-testsuite-
Flags: in-litmus-
You need to log in
before you can comment on or make changes to this bug.
Description
•