diff options
author | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2014-11-22 17:15:52 +0000 |
---|---|---|
committer | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2014-11-22 17:15:52 +0000 |
commit | 335ba082fdb1ecbdd16c990db81e1d50c943e13e (patch) | |
tree | 33c5cf0f06927761668086a881b3bac4c3abcbf8 /amiga/schedule.c | |
parent | 4a395ad025e3f453faacc2b3a90f64ede10bef40 (diff) | |
download | netsurf-335ba082fdb1ecbdd16c990db81e1d50c943e13e.tar.gz netsurf-335ba082fdb1ecbdd16c990db81e1d50c943e13e.tar.bz2 |
Ensure we're not running events ahead of time.
Diffstat (limited to 'amiga/schedule.c')
-rwxr-xr-x | amiga/schedule.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/amiga/schedule.c b/amiga/schedule.c index d49db1bc4..b5a115d09 100755 --- a/amiga/schedule.c +++ b/amiga/schedule.c @@ -247,6 +247,7 @@ static void ami_scheduler_run(struct MsgPort *nsmsgport) struct nscallback *nscb; void (*callback)(void *p); void *p; + struct TimeVal tv; struct ami_schedule_message *asmsg = AllocSysObjectTags(ASOT_MESSAGE, ASOMSG_Size, sizeof(struct ami_schedule_message), @@ -255,6 +256,13 @@ static void ami_scheduler_run(struct MsgPort *nsmsgport) nscb = pblHeapGetFirst(schedule_list); if(nscb == -1) return; + /* Ensure the scheduled event time has passed (CmpTime<=0) + * in case something been deleted between the timer + * signalling us and us responding to it. + */ + GetSysTime(&tv); + if(CmpTime(&tv, &nscb->tv) > 0) return; + callback = nscb->callback; p = nscb->p; ami_schedule_remove_timer_event(nscb); @@ -462,8 +470,7 @@ static int32 ami_scheduler_process(STRPTR args, int32 length, APTR execbase) * it crashes if we reply after schedule_run has executed. */ ReplyMsg((struct Message *)timermsg); - ami_scheduler_run(nsmsgport); /* \todo check timer event doesn't relate to - * something that's been deleted already */ + ami_scheduler_run(nsmsgport); } } } |