NS_IMETHODIMP XPCJSContextStack::SetSafeJSContext(JSContext * aSafeJSContext) { if(mOwnSafeJSContext && mOwnSafeJSContext == mSafeJSContext && mOwnSafeJSContext != aSafeJSContext) { JS_DestroyContextNoGC(mOwnSafeJSContext); mOwnSafeJSContext = nsnull; } mSafeJSContext = aSafeJSContext; return NS_OK; }
void SG_jscontextpool__teardown(SG_context * pCtx) { if(gpJSContextPoolGlobalState!=NULL) { SG_ERR_CHECK_RETURN( SG_mutex__lock(pCtx, &gpJSContextPoolGlobalState->lock) ); // Wait until all outstanding SG_jscontexts have been released. Don't try to terminate // early, otherwise we have a race condition on our hands: If the outstanding SG_jscontext // tries to perform any JavaScript operations before the app terminates, but after we have // called JS_Shutdown(), we'll end up crashing on exit. This of course is worse than // making the user hit Ctrl-C again to do a hard shutdown if it's taking too long. if(gpJSContextPoolGlobalState->numContextsCheckedOut > 0) { SG_ERR_IGNORE( SG_log__report_warning(pCtx, "Waiting on %d SG_jscontexts that are still in use.", gpJSContextPoolGlobalState->numContextsCheckedOut) ); while(gpJSContextPoolGlobalState->numContextsCheckedOut > 0) { SG_ERR_CHECK_RETURN( SG_mutex__unlock(pCtx, &gpJSContextPoolGlobalState->lock) ); SG_sleep_ms(10); SG_ERR_CHECK_RETURN( SG_mutex__lock(pCtx, &gpJSContextPoolGlobalState->lock) ); } } SG_ERR_CHECK_RETURN( SG_mutex__unlock(pCtx, &gpJSContextPoolGlobalState->lock) ); SG_mutex__destroy(&gpJSContextPoolGlobalState->lock); while(gpJSContextPoolGlobalState->pFirstAvailableContext!=NULL) { SG_jscontext * pJs = gpJSContextPoolGlobalState->pFirstAvailableContext; gpJSContextPoolGlobalState->pFirstAvailableContext = pJs->pNextAvailableContext; (void)JS_SetContextThread(pJs->cx); JS_BeginRequest(pJs->cx); JS_SetContextPrivate(pJs->cx, pCtx); JS_DestroyContextNoGC(pJs->cx); if(SG_context__has_err(pCtx)) // An error was produced during GC... { SG_log__report_error__current_error(pCtx); SG_context__err_reset(pCtx); } SG_NULLFREE(pCtx, pJs); } SG_VHASH_NULLFREE(pCtx, gpJSContextPoolGlobalState->pServerConfig); SG_NULLFREE(pCtx, gpJSContextPoolGlobalState); } }