backing out changes for 129953...

This commit is contained in:
pavlov%netscape.com 2002-04-11 05:38:55 +00:00
Родитель 8f749c03ae
Коммит 0f9706f1e1
7 изменённых файлов: 28 добавлений и 203 удалений

Просмотреть файл

@ -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<nsITimerManager> 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<nsITimerManager> 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);

Просмотреть файл

@ -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)

Просмотреть файл

@ -62,7 +62,6 @@ EXPORTS = \
XPIDLSRCS = \
nsIThread.idl \
nsIThreadPool.idl \
nsITimerManager.idl \
nsIRunnable.idl \
nsIEventQueue.idl \
nsIEventQueueService.idl \

Просмотреть файл

@ -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();
}

Просмотреть файл

@ -45,7 +45,6 @@ XPIDLSRCS = \
.\nsIEventQueueService.idl \
.\nsIThread.idl \
.\nsIThreadPool.idl \
.\nsITimerManager.idl \
.\nsIRunnable.idl \
.\nsIProcess.idl \
.\nsIScriptableTimer.idl \

Просмотреть файл

@ -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<nsIThread> 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<nsIThread> 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<nsIThread> 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;
}

Просмотреть файл

@ -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___ */