// static XPCPerThreadData* XPCPerThreadData::GetDataImpl(JSContext *cx) { XPCPerThreadData* data; if(!gLock) { gLock = PR_NewLock(); if(!gLock) return nsnull; } if(gTLSIndex == BAD_TLS_INDEX) { nsAutoLock lock(gLock); // check again now that we have the lock... if(gTLSIndex == BAD_TLS_INDEX) { if(PR_FAILURE == PR_NewThreadPrivateIndex(&gTLSIndex, xpc_ThreadDataDtorCB)) { NS_ERROR("PR_NewThreadPrivateIndex failed!"); gTLSIndex = BAD_TLS_INDEX; return nsnull; } } } data = (XPCPerThreadData*) PR_GetThreadPrivate(gTLSIndex); if(!data) { data = new XPCPerThreadData(); if(!data || !data->IsValid()) { NS_ERROR("new XPCPerThreadData() failed!"); if(data) delete data; return nsnull; } if(PR_FAILURE == PR_SetThreadPrivate(gTLSIndex, data)) { NS_ERROR("PR_SetThreadPrivate failed!"); delete data; return nsnull; } } if(cx && !sMainJSThread && NS_IsMainThread()) { sMainJSThread = cx->thread; sMainThreadData = data; sMainThreadData->mThread = PR_GetCurrentThread(); } return data; }