diff --git a/mozilla/widget/src/windows/nsAppShell.cpp b/mozilla/widget/src/windows/nsAppShell.cpp index 9c39929c09d..c585ee8ef0e 100644 --- a/mozilla/widget/src/windows/nsAppShell.cpp +++ b/mozilla/widget/src/windows/nsAppShell.cpp @@ -89,21 +89,12 @@ NS_METHOD nsAppShell::SetDispatchListener(nsDispatchListener* aDispatchListener) // //------------------------------------------------------------------------- -#include "nsITimerManager.h" - - NS_METHOD nsAppShell::Run(void) { NS_ADDREF_THIS(); MSG msg; int keepGoing = 1; - nsresult rv; - nsCOMPtr timerManager(do_GetService("@mozilla.org/timer/manager;1", &rv)); - if (NS_FAILED(rv)) return rv; - - timerManager->SetUseIdleTimers(PR_TRUE); - gKeepGoing = 1; // Process messages do { @@ -125,26 +116,15 @@ NS_METHOD nsAppShell::Run(void) mDispatchListener->AfterDispatch(); } } else { - - PRBool hasTimers; - timerManager->HasIdleTimers(&hasTimers); - if (hasTimers) { - do { - timerManager->FireNextIdleTimer(); - timerManager->HasIdleTimers(&hasTimers); - } while (hasTimers && !::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)); + if (!gKeepGoing) { + // In this situation, PostQuitMessage() was called, but the WM_QUIT + // message was removed from the event queue by someone else - + // (see bug #54725). So, just exit the loop as if WM_QUIT had been + // reeceived... + keepGoing = 0; } else { - - if (!gKeepGoing) { - // In this situation, PostQuitMessage() was called, but the WM_QUIT - // message was removed from the event queue by someone else - - // (see bug #54725). So, just exit the loop as if WM_QUIT had been - // reeceived... - keepGoing = 0; - } else { - // Block and wait for any posted application message - ::WaitMessage(); - } + // Block and wait for any posted application message + ::WaitMessage(); } } @@ -169,10 +149,6 @@ nsAppShell::GetNativeEvent(PRBool &aRealEvent, void *&aEvent) BOOL gotMessage = false; - nsresult rv; - nsCOMPtr timerManager(do_GetService("@mozilla.org/timer/manager;1", &rv)); - if (NS_FAILED(rv)) return rv; - do { // Give priority to system messages (in particular keyboard, mouse, // timer, and paint messages). @@ -182,17 +158,8 @@ nsAppShell::GetNativeEvent(PRBool &aRealEvent, void *&aEvent) gotMessage = true; } else { - PRBool hasTimers; - timerManager->HasIdleTimers(&hasTimers); - if (hasTimers) { - do { - timerManager->FireNextIdleTimer(); - timerManager->HasIdleTimers(&hasTimers); - } while (hasTimers && !::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)); - } else { - // Block and wait for any posted application message - ::WaitMessage(); - } + // Block and wait for any posted application message + ::WaitMessage(); } } while (!gotMessage); diff --git a/mozilla/xpcom/build/nsXPComInit.cpp b/mozilla/xpcom/build/nsXPComInit.cpp index c7cfc9c6f6b..f8a14143e80 100644 --- a/mozilla/xpcom/build/nsXPComInit.cpp +++ b/mozilla/xpcom/build/nsXPComInit.cpp @@ -131,7 +131,6 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsConsoleService); NS_GENERIC_FACTORY_CONSTRUCTOR(nsAtomService); NS_GENERIC_FACTORY_CONSTRUCTOR(nsExceptionService); NS_GENERIC_FACTORY_CONSTRUCTOR(nsTimerImpl); -NS_GENERIC_FACTORY_CONSTRUCTOR(nsTimerManager); NS_GENERIC_FACTORY_CONSTRUCTOR(nsVariant); @@ -249,7 +248,6 @@ static const nsModuleComponentInfo components[] = { COMPONENT(XPCOMPROXY, nsProxyObjectManager::Create), COMPONENT(TIMER, nsTimerImplConstructor), - COMPONENT(TIMERMANAGER, nsTimerManagerConstructor), #define COMPONENT_SUPPORTS(TYPE, Type) \ COMPONENT(SUPPORTS_##TYPE, nsSupports##Type##ImplConstructor) diff --git a/mozilla/xpcom/threads/Makefile.in b/mozilla/xpcom/threads/Makefile.in index 0eafb9ac4fa..c3d2147f42e 100644 --- a/mozilla/xpcom/threads/Makefile.in +++ b/mozilla/xpcom/threads/Makefile.in @@ -62,7 +62,6 @@ EXPORTS = \ XPIDLSRCS = \ nsIThread.idl \ nsIThreadPool.idl \ - nsITimerManager.idl \ nsIRunnable.idl \ nsIEventQueue.idl \ nsIEventQueueService.idl \ diff --git a/mozilla/xpcom/threads/TimerThread.cpp b/mozilla/xpcom/threads/TimerThread.cpp index d0ef5130eb6..c15f458df3b 100644 --- a/mozilla/xpcom/threads/TimerThread.cpp +++ b/mozilla/xpcom/threads/TimerThread.cpp @@ -218,17 +218,17 @@ NS_IMETHODIMP TimerThread::Run() } #endif - // We are going to let the call to PostTimerEvent here handle the release of the + // We are going to let the call to Fire here handle the release of the // timer so that we don't end up releasing the timer on the TimerThread // instead of on the thread it targets. - timer->PostTimerEvent(); + timer->Fire(); timer = nsnull; lock.lock(); if (!mProcessing) break; - // Update now, as PostTimerEvent plus the locking may have taken a tick or two, + // Update now, as Fire plus the locking may have taken a tick or two, // and we may goto next below. now = PR_IntervalNow(); } diff --git a/mozilla/xpcom/threads/makefile.win b/mozilla/xpcom/threads/makefile.win index fe1b4118190..24c150307ca 100644 --- a/mozilla/xpcom/threads/makefile.win +++ b/mozilla/xpcom/threads/makefile.win @@ -45,7 +45,6 @@ XPIDLSRCS = \ .\nsIEventQueueService.idl \ .\nsIThread.idl \ .\nsIThreadPool.idl \ - .\nsITimerManager.idl \ .\nsIRunnable.idl \ .\nsIProcess.idl \ .\nsIScriptableTimer.idl \ diff --git a/mozilla/xpcom/threads/nsTimerImpl.cpp b/mozilla/xpcom/threads/nsTimerImpl.cpp index 363733aaebc..131d69d7bd3 100644 --- a/mozilla/xpcom/threads/nsTimerImpl.cpp +++ b/mozilla/xpcom/threads/nsTimerImpl.cpp @@ -36,17 +36,10 @@ #include "nsTimerImpl.h" #include "TimerThread.h" -#include "nsSupportsArray.h" - #include "nsIEventQueue.h" static TimerThread *gThread = nsnull; - // only the main thread supports idle timers. -static nsSupportsArray *gIdleTimers = nsnull; - -static PRBool gFireOnIdle = PR_FALSE; - #include "prmem.h" #include "prinit.h" @@ -200,9 +193,6 @@ void nsTimerImpl::Shutdown() gThread->Shutdown(); NS_RELEASE(gThread); - - gFireOnIdle = PR_FALSE; - NS_IF_RELEASE(gIdleTimers); } @@ -295,11 +285,11 @@ NS_IMETHODIMP_(void) nsTimerImpl::SetType(PRUint32 aType) { mType = (PRUint8)aType; // XXX if this is called, we should change the actual type.. this could effect - // repeating timers. we need to ensure in Fire() that if mType has changed + // repeating timers. we need to ensure in Process() that if mType has changed // during the callback that we don't end up with the timer in the queue twice. } -void nsTimerImpl::Fire() +void nsTimerImpl::Process() { if (mCanceled) return; @@ -327,7 +317,7 @@ void nsTimerImpl::Fire() PRIntervalTime timeout = mTimeout; if (mType == NS_TYPE_REPEATING_PRECISE) { // Precise repeating timers advance mTimeout by mDelay without fail before - // calling Fire(). + // calling Process(). timeout -= mDelay; } gThread->UpdateFilter(mDelay, timeout, now); @@ -354,7 +344,7 @@ void nsTimerImpl::Fire() #ifdef DEBUG_TIMERS if (PR_LOG_TEST(gTimerLog, PR_LOG_DEBUG)) { PR_LOG(gTimerLog, PR_LOG_DEBUG, - ("[this=%p] Took %dms to fire timer callback\n", + ("[this=%p] Took %dms to fire process timer callback\n", this, PR_IntervalToMilliseconds(PR_IntervalNow() - now))); } #endif @@ -367,7 +357,7 @@ void nsTimerImpl::Fire() } -struct TimerEventType { +struct MyEventType { PLEvent e; // arguments follow... #ifdef DEBUG_TIMERS @@ -376,34 +366,22 @@ struct TimerEventType { }; -void* handleTimerEvent(TimerEventType* event) +void* handleMyEvent(MyEventType* event) { #ifdef DEBUG_TIMERS if (PR_LOG_TEST(gTimerLog, PR_LOG_DEBUG)) { PRIntervalTime now = PR_IntervalNow(); PR_LOG(gTimerLog, PR_LOG_DEBUG, - ("[this=%p] time between PostTimerEvent() and Fire(): %dms\n", + ("[this=%p] time between Fire() and Process(): %dms\n", event->e.owner, PR_IntervalToMilliseconds(now - event->mInit))); } #endif - - if (gFireOnIdle) { - nsCOMPtr currentThread, mainThread; - nsIThread::GetCurrent(getter_AddRefs(currentThread)); - nsIThread::GetMainThread(getter_AddRefs(mainThread)); - if (currentThread == mainThread) { - gIdleTimers->AppendElement(NS_STATIC_CAST(nsITimer*, NS_STATIC_CAST(nsTimerImpl*, event->e.owner))); - - return NULL; - } - } - - NS_STATIC_CAST(nsTimerImpl*, event->e.owner)->Fire(); + NS_STATIC_CAST(nsTimerImpl*, event->e.owner)->Process(); return NULL; } -void destroyTimerEvent(TimerEventType* event) +void destroyMyEvent(MyEventType* event) { nsTimerImpl *timer = NS_STATIC_CAST(nsTimerImpl*, event->e.owner); NS_RELEASE(timer); @@ -411,19 +389,19 @@ void destroyTimerEvent(TimerEventType* event) } -void nsTimerImpl::PostTimerEvent() +void nsTimerImpl::Fire() { // XXX we may want to reuse the PLEvent in the case of repeating timers. - TimerEventType* event; + MyEventType* event; // construct - event = PR_NEW(TimerEventType); + event = PR_NEW(MyEventType); if (event == NULL) return; // initialize PL_InitEvent((PLEvent*)event, this, - (PLHandleEventProc)handleTimerEvent, - (PLDestroyEventProc)destroyTimerEvent); + (PLHandleEventProc)handleMyEvent, + (PLDestroyEventProc)destroyMyEvent); // Since TimerThread addref'd 'this' for us, we don't need to addref here. // We will release in destroyMyEvent. @@ -494,96 +472,3 @@ NS_NewTimer(nsITimer* *aResult, nsTimerCallbackFunc aCallback, void *aClosure, *aResult = timer; return NS_OK; } - - -/** - * Timer Manager code - */ - -NS_IMPL_THREADSAFE_ISUPPORTS1(nsTimerManager, nsITimerManager) - -nsTimerManager::nsTimerManager() -{ - NS_INIT_REFCNT(); -} - -nsTimerManager::~nsTimerManager() -{ - -} - -NS_IMETHODIMP nsTimerManager::SetUseIdleTimers(PRBool aUseIdleTimers) -{ - if (aUseIdleTimers == PR_FALSE && gFireOnIdle == PR_TRUE) - return NS_ERROR_FAILURE; - - gFireOnIdle = aUseIdleTimers; - - if (gFireOnIdle && !gIdleTimers) { - gIdleTimers = new nsSupportsArray(); - if (!gIdleTimers) - return NS_ERROR_OUT_OF_MEMORY; - - NS_ADDREF(gIdleTimers); - } - - return NS_OK; -} - -NS_IMETHODIMP nsTimerManager::GetUseIdleTimers(PRBool *aUseIdleTimers) -{ - *aUseIdleTimers = gFireOnIdle; - return NS_OK; -} - -NS_IMETHODIMP nsTimerManager::HasIdleTimers(PRBool *aHasTimers) -{ - *aHasTimers = PR_FALSE; - - if (!gFireOnIdle) - return NS_OK; - - nsCOMPtr currentThread, mainThread; - nsIThread::GetCurrent(getter_AddRefs(currentThread)); - nsIThread::GetMainThread(getter_AddRefs(mainThread)); - - if (currentThread != mainThread) { - return NS_OK; - } - - PRUint32 count; - gIdleTimers->Count(&count); - *aHasTimers = (count != 0); - - return NS_OK; -} - -NS_IMETHODIMP nsTimerManager::FireNextIdleTimer() -{ - if (!gFireOnIdle) - return NS_OK; - - nsCOMPtr currentThread, mainThread; - nsIThread::GetCurrent(getter_AddRefs(currentThread)); - nsIThread::GetMainThread(getter_AddRefs(mainThread)); - - if (currentThread != mainThread) { - return NS_OK; - } - - PRUint32 count; - gIdleTimers->Count(&count); - - if (count > 0) { - nsTimerImpl *theTimer = NS_STATIC_CAST(nsTimerImpl*, NS_STATIC_CAST(nsITimer*, gIdleTimers->ElementAt(0))); // addrefs - - gIdleTimers->RemoveElement(NS_STATIC_CAST(nsITimer*, theTimer), 0); - - theTimer->Fire(); - - NS_RELEASE(theTimer); - } - // pull out each one starting at the beginning until no more are left and fire them. - - return NS_OK; -} diff --git a/mozilla/xpcom/threads/nsTimerImpl.h b/mozilla/xpcom/threads/nsTimerImpl.h index 13f2a0e109f..63060f98b1e 100644 --- a/mozilla/xpcom/threads/nsTimerImpl.h +++ b/mozilla/xpcom/threads/nsTimerImpl.h @@ -84,8 +84,8 @@ public: friend class TimerThread; - void PostTimerEvent(); void Fire(); + void Process(); void SetDelayInternal(PRUint32 aDelay); NS_IMETHOD Init(nsTimerCallbackFunc aFunc, @@ -153,27 +153,4 @@ private: }; -#define NS_TIMERMANAGER_CONTRACTID "@mozilla.org/timer/manager;1" -#define NS_TIMERMANAGER_CLASSNAME "Timer Manager" -#define NS_TIMERMANAGER_CID \ -{ /* 4fe206fa-1dd2-11b2-8a0a-88bacbecc7d2 */ \ - 0x4fe206fa, \ - 0x1dd2, \ - 0x11b2, \ - {0x8a, 0x0a, 0x88, 0xba, 0xcb, 0xec, 0xc7, 0xd2} \ -} - -#include "nsITimerManager.h" - -class nsTimerManager : nsITimerManager -{ -public: - nsTimerManager(); - virtual ~nsTimerManager(); - - NS_DECL_ISUPPORTS - NS_DECL_NSITIMERMANAGER -}; - - #endif /* nsTimerImpl_h___ */