mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
bazaar: Timer fixes porting from upstream
git-svn-id: svn://ultimatepp.org/upp/trunk@3296 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
4883dbae53
commit
7c3e1219d3
3 changed files with 57 additions and 6 deletions
|
|
@ -22,12 +22,13 @@ Timer::~Timer()
|
|||
void Timer::sTimeCallback(dword time, int delay, Callback cb, void *id) {
|
||||
TimeEvent *list = elist.GetPtr();
|
||||
TimeEvent *e;
|
||||
for(e = list->GetNext(); e != list && time >= e->time; e = e->GetNext());
|
||||
for(e = list->GetNext(); e != list && ((int)(time - e->time) >= 0); e = e->GetNext());
|
||||
TimeEvent *ne = e->InsertPrev();
|
||||
ne->time = time;
|
||||
ne->cb = cb;
|
||||
ne->delay = delay;
|
||||
ne->id = id;
|
||||
ne->rep = false;
|
||||
}
|
||||
|
||||
void Timer::SetTimeCallback(int delay_ms, Callback cb, void *id) {
|
||||
|
|
@ -73,7 +74,8 @@ void Timer::KillTimeCallback(void *id) {
|
|||
KillTimeCallbacks(id);
|
||||
}
|
||||
|
||||
void Timer::TimerProc(dword time, int & leftsleep)
|
||||
#if 0
|
||||
void Timer::TimerProc(dword time, int& leftsleep)
|
||||
{
|
||||
if(IsPanicMode())
|
||||
return;
|
||||
|
|
@ -90,16 +92,63 @@ void Timer::TimerProc(dword time, int & leftsleep)
|
|||
while(list->GetNext() != list && ((leftsleep = (list->GetNext()->time - time)) <= 0)) {
|
||||
TimeEvent *e = list->GetNext();
|
||||
e->Unlink();
|
||||
if(e->delay < 0)
|
||||
sTimeCallback(time - e->delay, e->delay, e->cb, e->id);
|
||||
sTimerLock.Leave();
|
||||
e->cb();
|
||||
sTimerLock.Enter();
|
||||
if(e->delay < 0) {
|
||||
dword t = GetTickCount();
|
||||
sTimeCallback(t + (t == time) - e->delay, e->delay, e->cb, e->id);
|
||||
}
|
||||
delete e;
|
||||
}
|
||||
sTimerLock.Leave();
|
||||
if(leftsleep < 0) leftsleep = granularity; //if last done has been processed and no more in queue, ensure good sleep
|
||||
}
|
||||
#else
|
||||
void Timer::TimerProc(dword time, int& leftsleep)
|
||||
{
|
||||
if(IsPanicMode())
|
||||
return;
|
||||
sTimerLock.Enter();
|
||||
TimeEvent *list = elist.GetPtr();;
|
||||
sTClick = time;
|
||||
|
||||
// sTimerLock.Leave();
|
||||
// //***
|
||||
// sTimerLock.Enter();
|
||||
|
||||
TimeEvent *e = list->GetNext();
|
||||
while(e != list && ((leftsleep = (e->time - (int)time)) <= 0) && !e->rep) {
|
||||
// while(e != list && ((int)(time - e->time)) >= 0 && !e->rep) {
|
||||
TimeEvent *w = e;
|
||||
e = e->GetNext();
|
||||
w->Unlink();
|
||||
//eventid++;
|
||||
Callback cb = w->cb;
|
||||
if(w->delay < 0) {
|
||||
w->rep = true;
|
||||
w->LinkBefore(elist.GetPtr());
|
||||
}
|
||||
else
|
||||
delete w;
|
||||
sTimerLock.Leave();
|
||||
cb();
|
||||
sTimerLock.Enter();
|
||||
}
|
||||
time = GetTickCount();
|
||||
e = list->GetPrev();
|
||||
while(e != list && e->rep) {
|
||||
TimeEvent *w = e;
|
||||
e = e->GetPrev();
|
||||
w->Unlink();
|
||||
sTimeCallback(time - w->delay, w->delay, w->cb, w->id);
|
||||
if((-w->delay) < leftsleep) leftsleep = -w->delay;
|
||||
delete w;
|
||||
}
|
||||
sTimerLock.Leave();
|
||||
if(leftsleep < 0) leftsleep = granularity; //if last done has been processed and no more in queue, ensure good sleep
|
||||
}
|
||||
#endif
|
||||
|
||||
//SAME API AS IN Ctrl
|
||||
void Timer::SetTimeCallback(int delay_ms, Callback cb, int id) {
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ private:
|
|||
int delay;
|
||||
Callback cb;
|
||||
void *id;
|
||||
bool rep;
|
||||
|
||||
unsigned GetHashValue() const { return GetPtrHashValue(id); }
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#include "TimerTest.h"
|
||||
|
||||
#define REPEAT_TEST
|
||||
#define TIMEOUT 1000
|
||||
|
||||
TimerTest::TimerTest()
|
||||
: demo(0)
|
||||
|
|
@ -11,7 +12,7 @@ TimerTest::TimerTest()
|
|||
ASSERT(a==1); //preload, 1 means running demo mode, 2 means a cb is executing
|
||||
|
||||
#ifdef REPEAT_TEST
|
||||
t.SetTimeCallback(-100, THISBACK(Test), (int)this);
|
||||
t.SetTimeCallback(-TIMEOUT, THISBACK(Test), (int)this);
|
||||
#else
|
||||
t.SetTimeCallback(0, THISBACK(Test), (int)this);
|
||||
#endif
|
||||
|
|
@ -38,7 +39,7 @@ void TimerTest::Test()
|
|||
|
||||
#ifdef REPEAT_TEST
|
||||
#else
|
||||
t.SetTimeCallback(100, THISBACK(Test), (int)this);
|
||||
t.SetTimeCallback(TIMEOUT, THISBACK(Test), (int)this);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue