// static void XPCJSRuntime::TraceJS(JSTracer* trc, void* data) { XPCJSRuntime* self = (XPCJSRuntime*)data; // Skip this part if XPConnect is shutting down. We get into // bad locking problems with the thread iteration otherwise. if(!self->GetXPConnect()->IsShuttingDown()) { PRLock* threadLock = XPCPerThreadData::GetLock(); if(threadLock) { // scoped lock nsAutoLock lock(threadLock); XPCPerThreadData* iterp = nsnull; XPCPerThreadData* thread; while(nsnull != (thread = XPCPerThreadData::IterateThreads(&iterp))) { // Trace those AutoMarkingPtr lists! thread->TraceJS(trc); } } } // XPCJSObjectHolders don't participate in cycle collection, so always trace // them here. for(XPCRootSetElem *e = self->mObjectHolderRoots; e ; e = e->GetNextRoot()) static_cast<XPCJSObjectHolder*>(e)->TraceJS(trc); // Mark these roots as gray so the CC can walk them later. js::GCMarker *gcmarker = NULL; if (IS_GC_MARKING_TRACER(trc)) { gcmarker = static_cast<js::GCMarker *>(trc); JS_ASSERT(gcmarker->getMarkColor() == XPC_GC_COLOR_BLACK); gcmarker->setMarkColor(XPC_GC_COLOR_GRAY); } self->TraceXPConnectRoots(trc); if (gcmarker) gcmarker->setMarkColor(XPC_GC_COLOR_BLACK); }
// static void XPCJSRuntime::TraceJS(JSTracer* trc, void* data) { XPCJSRuntime* self = (XPCJSRuntime*)data; // Skip this part if XPConnect is shutting down. We get into // bad locking problems with the thread iteration otherwise. if(!self->GetXPConnect()->IsShuttingDown()) { PRLock* threadLock = XPCPerThreadData::GetLock(); if(threadLock) { // scoped lock nsAutoLock lock(threadLock); XPCPerThreadData* iterp = nsnull; XPCPerThreadData* thread; while(nsnull != (thread = XPCPerThreadData::IterateThreads(&iterp))) { // Trace those AutoMarkingPtr lists! thread->TraceJS(trc); } } } // XPCJSObjectHolders don't participate in cycle collection, so always trace // them here. for(XPCRootSetElem *e = self->mObjectHolderRoots; e ; e = e->GetNextRoot()) static_cast<XPCJSObjectHolder*>(e)->TraceJS(trc); if(self->GetXPConnect()->ShouldTraceRoots()) { // Only trace these if we're not cycle-collecting, the cycle collector // will do that if we are. self->TraceXPConnectRoots(trc); } }