From 4131c7c96ca75f82b64b072d7ad4b9da066a73a7 Mon Sep 17 00:00:00 2001 From: "brendan%mozilla.org" Date: Tue, 7 Jan 2003 21:56:52 +0000 Subject: [PATCH] Don't hold the GC lock when calling the GC callback (186592, r=shaver). --- js/src/jsgc.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/js/src/jsgc.c b/js/src/jsgc.c index 467e193cffa8..5a8f542a8e59 100644 --- a/js/src/jsgc.c +++ b/js/src/jsgc.c @@ -1277,8 +1277,16 @@ restart: } } - if (rt->gcCallback) - (void) rt->gcCallback(cx, JSGC_MARK_END); +#define GC_CALLBACK(status) \ + if (rt->gcCallback) { \ + if (gcflags & GC_ALREADY_LOCKED) \ + JS_UNLOCK_GC(rt); \ + (void) rt->gcCallback(cx, status); \ + if (gcflags & GC_ALREADY_LOCKED) \ + JS_LOCK_GC(rt); \ + } + + GC_CALLBACK(JSGC_MARK_END); /* * Sweep phase. @@ -1370,8 +1378,7 @@ restart: /* Terminate the new freelist. */ *flp = NULL; - if (rt->gcCallback) - (void) rt->gcCallback(cx, JSGC_FINALIZE_END); + GC_CALLBACK(JSGC_FINALIZE_END); out: JS_LOCK_GC(rt); @@ -1395,6 +1402,7 @@ out: JS_UNLOCK_GC(rt); #endif - if (rt->gcCallback) - (void) rt->gcCallback(cx, JSGC_END); + GC_CALLBACK(JSGC_END); + +#undef GC_CALLBACK }