mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
Relanding bug 326777, r=bsmedberg, sr=jst
This commit is contained in:
parent
bf0bcff1f1
commit
3b90c5c518
@ -50,8 +50,12 @@
|
|||||||
#include "jsfun.h"
|
#include "jsfun.h"
|
||||||
#include "jsobj.h"
|
#include "jsobj.h"
|
||||||
#include "jsscript.h"
|
#include "jsscript.h"
|
||||||
|
#include "nsThreadUtilsInternal.h"
|
||||||
|
|
||||||
NS_IMPL_THREADSAFE_ISUPPORTS2(nsXPConnect,nsIXPConnect,nsISupportsWeakReference)
|
NS_IMPL_THREADSAFE_ISUPPORTS3(nsXPConnect,
|
||||||
|
nsIXPConnect,
|
||||||
|
nsISupportsWeakReference,
|
||||||
|
nsIThreadObserver)
|
||||||
|
|
||||||
nsXPConnect* nsXPConnect::gSelf = nsnull;
|
nsXPConnect* nsXPConnect::gSelf = nsnull;
|
||||||
JSBool nsXPConnect::gOnceAliveNowDead = JS_FALSE;
|
JSBool nsXPConnect::gOnceAliveNowDead = JS_FALSE;
|
||||||
@ -286,6 +290,10 @@ nsXPConnect::GetXPConnect()
|
|||||||
// Initial extra ref to keep the singleton alive
|
// Initial extra ref to keep the singleton alive
|
||||||
// balanced by explicit call to ReleaseXPConnectSingleton()
|
// balanced by explicit call to ReleaseXPConnectSingleton()
|
||||||
NS_ADDREF(gSelf);
|
NS_ADDREF(gSelf);
|
||||||
|
if (NS_FAILED(NS_SetGlobalThreadObserver(gSelf))) {
|
||||||
|
NS_RELEASE(gSelf);
|
||||||
|
// Fall through to returning null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return gSelf;
|
return gSelf;
|
||||||
@ -307,6 +315,7 @@ nsXPConnect::ReleaseXPConnectSingleton()
|
|||||||
nsXPConnect* xpc = gSelf;
|
nsXPConnect* xpc = gSelf;
|
||||||
if(xpc)
|
if(xpc)
|
||||||
{
|
{
|
||||||
|
NS_SetGlobalThreadObserver(nsnull);
|
||||||
|
|
||||||
#ifdef XPC_TOOLS_SUPPORT
|
#ifdef XPC_TOOLS_SUPPORT
|
||||||
if(xpc->mProfiler)
|
if(xpc->mProfiler)
|
||||||
@ -2014,6 +2023,31 @@ nsXPConnect::FlagSystemFilenamePrefix(const char *aFilenamePrefix)
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXPConnect::OnProcessNextEvent(nsIThreadInternal *aThread, PRBool aMayWait,
|
||||||
|
PRUint32 aRecursionDepth)
|
||||||
|
{
|
||||||
|
// Push a null JSContext so that we don't see any script during
|
||||||
|
// event processing.
|
||||||
|
NS_ENSURE_STATE(mContextStack);
|
||||||
|
return mContextStack->Push(nsnull);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXPConnect::AfterProcessNextEvent(nsIThreadInternal *aThread,
|
||||||
|
PRUint32 aRecursionDepth)
|
||||||
|
{
|
||||||
|
NS_ENSURE_STATE(mContextStack);
|
||||||
|
return mContextStack->Pop(nsnull);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXPConnect::OnDispatchedEvent(nsIThreadInternal* aThread)
|
||||||
|
{
|
||||||
|
NS_NOTREACHED("Why tell us?");
|
||||||
|
return NS_ERROR_UNEXPECTED;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
/* These are here to be callable from a debugger */
|
/* These are here to be callable from a debugger */
|
||||||
JS_BEGIN_EXTERN_C
|
JS_BEGIN_EXTERN_C
|
||||||
|
@ -126,6 +126,8 @@
|
|||||||
#include "nsIXPCToolsProfiler.h"
|
#include "nsIXPCToolsProfiler.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "nsIThreadInternal.h"
|
||||||
|
|
||||||
#ifdef XPC_IDISPATCH_SUPPORT
|
#ifdef XPC_IDISPATCH_SUPPORT
|
||||||
// This goop was added because of EXCEPINFO in ThrowCOMError
|
// This goop was added because of EXCEPINFO in ThrowCOMError
|
||||||
// This include is here, because it needs to occur before the undefines below
|
// This include is here, because it needs to occur before the undefines below
|
||||||
@ -426,6 +428,7 @@ const PRBool OBJ_IS_NOT_GLOBAL = PR_FALSE;
|
|||||||
struct JSObjectRefcounts;
|
struct JSObjectRefcounts;
|
||||||
|
|
||||||
class nsXPConnect : public nsIXPConnect,
|
class nsXPConnect : public nsIXPConnect,
|
||||||
|
public nsIThreadObserver,
|
||||||
public nsSupportsWeakReference,
|
public nsSupportsWeakReference,
|
||||||
public nsCycleCollectionLanguageRuntime,
|
public nsCycleCollectionLanguageRuntime,
|
||||||
public nsCycleCollectionParticipant
|
public nsCycleCollectionParticipant
|
||||||
@ -434,6 +437,7 @@ public:
|
|||||||
// all the interface method declarations...
|
// all the interface method declarations...
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
NS_DECL_NSIXPCONNECT
|
NS_DECL_NSIXPCONNECT
|
||||||
|
NS_DECL_NSITHREADOBSERVER
|
||||||
|
|
||||||
// non-interface implementation
|
// non-interface implementation
|
||||||
public:
|
public:
|
||||||
|
@ -69,6 +69,7 @@ CPPSRCS = \
|
|||||||
EXPORTS = \
|
EXPORTS = \
|
||||||
nsProcess.h \
|
nsProcess.h \
|
||||||
nsEventQueue.h \
|
nsEventQueue.h \
|
||||||
|
nsThreadUtilsInternal.h \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
XPIDLSRCS = \
|
XPIDLSRCS = \
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#include "nsAutoPtr.h"
|
#include "nsAutoPtr.h"
|
||||||
#include "nsCOMPtr.h"
|
#include "nsCOMPtr.h"
|
||||||
#include "prlog.h"
|
#include "prlog.h"
|
||||||
|
#include "nsThreadUtilsInternal.h"
|
||||||
|
|
||||||
#ifdef PR_LOGGING
|
#ifdef PR_LOGGING
|
||||||
static PRLogModuleInfo *sLog = PR_NewLogModule("nsThread");
|
static PRLogModuleInfo *sLog = PR_NewLogModule("nsThread");
|
||||||
@ -52,6 +53,8 @@ static PRLogModuleInfo *sLog = PR_NewLogModule("nsThread");
|
|||||||
|
|
||||||
NS_DECL_CI_INTERFACE_GETTER(nsThread)
|
NS_DECL_CI_INTERFACE_GETTER(nsThread)
|
||||||
|
|
||||||
|
nsIThreadObserver* nsThread::sGlobalObserver;
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Because we do not have our own nsIFactory, we have to implement nsIClassInfo
|
// Because we do not have our own nsIFactory, we have to implement nsIClassInfo
|
||||||
// somewhat manually.
|
// somewhat manually.
|
||||||
@ -464,6 +467,10 @@ nsThread::ProcessNextEvent(PRBool mayWait, PRBool *result)
|
|||||||
|
|
||||||
NS_ENSURE_STATE(PR_GetCurrentThread() == mThread);
|
NS_ENSURE_STATE(PR_GetCurrentThread() == mThread);
|
||||||
|
|
||||||
|
if (sGlobalObserver)
|
||||||
|
sGlobalObserver->OnProcessNextEvent(this, mayWait && !ShuttingDown(),
|
||||||
|
mRunningEvent);
|
||||||
|
|
||||||
nsCOMPtr<nsIThreadObserver> obs = mObserver;
|
nsCOMPtr<nsIThreadObserver> obs = mObserver;
|
||||||
if (obs)
|
if (obs)
|
||||||
obs->OnProcessNextEvent(this, mayWait && !ShuttingDown(), mRunningEvent);
|
obs->OnProcessNextEvent(this, mayWait && !ShuttingDown(), mRunningEvent);
|
||||||
@ -489,6 +496,9 @@ nsThread::ProcessNextEvent(PRBool mayWait, PRBool *result)
|
|||||||
if (obs)
|
if (obs)
|
||||||
obs->AfterProcessNextEvent(this, mRunningEvent);
|
obs->AfterProcessNextEvent(this, mRunningEvent);
|
||||||
|
|
||||||
|
if (sGlobalObserver)
|
||||||
|
sGlobalObserver->AfterProcessNextEvent(this, mRunningEvent);
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -618,3 +628,18 @@ nsThreadSyncDispatch::Run()
|
|||||||
}
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_SetGlobalThreadObserver(nsIThreadObserver* aObserver)
|
||||||
|
{
|
||||||
|
if (aObserver && nsThread::sGlobalObserver) {
|
||||||
|
return NS_ERROR_NOT_AVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!NS_IsMainThread()) {
|
||||||
|
return NS_ERROR_UNEXPECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsThread::sGlobalObserver = aObserver;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
@ -72,6 +72,9 @@ public:
|
|||||||
// nsIThreadManager::NewThread.
|
// nsIThreadManager::NewThread.
|
||||||
PRBool ShutdownRequired() { return mShutdownRequired; }
|
PRBool ShutdownRequired() { return mShutdownRequired; }
|
||||||
|
|
||||||
|
// The global thread observer
|
||||||
|
static nsIThreadObserver* sGlobalObserver;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class nsThreadShutdownEvent;
|
friend class nsThreadShutdownEvent;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user