summaryrefslogtreecommitdiff
path: root/amiga
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2014-11-22 17:15:52 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2014-11-22 17:15:52 +0000
commit335ba082fdb1ecbdd16c990db81e1d50c943e13e (patch)
tree33c5cf0f06927761668086a881b3bac4c3abcbf8 /amiga
parent4a395ad025e3f453faacc2b3a90f64ede10bef40 (diff)
downloadnetsurf-335ba082fdb1ecbdd16c990db81e1d50c943e13e.tar.gz
netsurf-335ba082fdb1ecbdd16c990db81e1d50c943e13e.tar.bz2
Ensure we're not running events ahead of time.
Diffstat (limited to 'amiga')
-rwxr-xr-xamiga/schedule.c11
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);
}
}
}