void sm_stop(spidermonkey_vm *vm) { begin_request(vm); spidermonkey_state *state = (spidermonkey_state *) JS_GetContextPrivate(vm->context); state->terminate = 1; JS_SetContextPrivate(vm->context, state); //Wait for any executing function to stop //before beginning to free up any memory. while (JS_IsRunning(vm->context)) { sleep(1); } end_request(vm); //Now we should be free to proceed with //freeing up memory without worrying about //crashing the VM. if (state != NULL) { if (state->error != NULL) { free_error(state); } driver_free(state); } JS_SetContextPrivate(vm->context, NULL); JS_DestroyContext(vm->context); JS_DestroyRuntime(vm->runtime); driver_free(vm); }
static JSBool chk(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { JSRuntime *rt = JS_GetRuntime(cx); JSContext *acx = JS_NewContext(rt, 8192); if (!acx) { JS_ReportOutOfMemory(cx); return JS_FALSE; } // acx should not be running bool ok = !JS_IsRunning(acx); if (!ok) JS_ReportError(cx, "Assertion failed: brand new context claims to be running"); JS_DestroyContext(acx); return ok; }
static bool chk(JSContext *cx, unsigned argc, jsval *vp) { JSRuntime *rt = JS_GetRuntime(cx); JSContext *acx = JS_NewContext(rt, 8192); if (!acx) { JS_ReportOutOfMemory(cx); return false; } // acx should not be running bool ok = !JS_IsRunning(acx); if (!ok) JS_ReportError(cx, "Assertion failed: brand new context claims to be running"); JS_DestroyContext(acx); return ok; }
XPCCallContext::~XPCCallContext() { // do cleanup... PRBool shouldReleaseXPC = PR_FALSE; if(mXPCContext) { mXPCContext->SetCallingLangType(mPrevCallerLanguage); #ifdef DEBUG XPCCallContext* old = mThreadData->SetCallContext(mPrevCallContext); NS_ASSERTION(old == this, "bad pop from per thread data"); #else (void) mThreadData->SetCallContext(mPrevCallContext); #endif shouldReleaseXPC = mPrevCallContext == nsnull; } if(mContextPopRequired) { XPCJSContextStack* stack = mThreadData->GetJSContextStack(); NS_ASSERTION(stack, "bad!"); if(stack) { #ifdef DEBUG JSContext* poppedCX; nsresult rv = stack->Pop(&poppedCX); NS_ASSERTION(NS_SUCCEEDED(rv) && poppedCX == mJSContext, "bad pop"); #else (void) stack->Pop(nsnull); #endif } } if(mJSContext) { if(mCallerLanguage == NATIVE_CALLER) JS_EndRequest(mJSContext); if(mDestroyJSContextInDestructor) { #ifdef DEBUG_xpc_hacker printf("!xpc - doing deferred destruction of JSContext @ %0x\n", mJSContext); #endif NS_ASSERTION(!mThreadData->GetJSContextStack() || !mThreadData->GetJSContextStack()-> DEBUG_StackHasJSContext(mJSContext), "JSContext still in threadjscontextstack!"); JS_DestroyContext(mJSContext); } else { // Don't clear newborns if JS frames (compilation or execution) // are active! Doing so violates ancient invariants in the JS // engine, and it's not necessary to fix JS component leaks. if(!JS_IsRunning(mJSContext)) JS_ClearNewbornRoots(mJSContext); } } #ifdef DEBUG { StringWrapperEntry *se = reinterpret_cast<StringWrapperEntry*>(&mStringWrapperData); PRUint32 i; for(i = 0; i < XPCCCX_STRING_CACHE_SIZE; ++i) { NS_ASSERTION(!se[i].mInUse, "Uh, string wrapper still in use!"); } } #endif if(shouldReleaseXPC && mXPC) NS_RELEASE(mXPC); }