diff options
author | James Bursa <james@netsurf-browser.org> | 2004-07-09 10:58:45 +0000 |
---|---|---|
committer | James Bursa <james@netsurf-browser.org> | 2004-07-09 10:58:45 +0000 |
commit | 403e39f5a4bd3f8a2ed0e4d34c68a2ea2072ba17 (patch) | |
tree | 161dc160483769d02e0bd7b27d5ce9c71a3482cf /riscos | |
parent | e387d5e34a2ae57b0f4d58bb16f844d9b923650e (diff) | |
download | netsurf-403e39f5a4bd3f8a2ed0e4d34c68a2ea2072ba17.tar.gz netsurf-403e39f5a4bd3f8a2ed0e4d34c68a2ea2072ba17.tar.bz2 |
[project @ 2004-07-09 10:58:45 by bursa]
Fix race condition in schedule_run() (fixes download-related crashes).
svn path=/import/netsurf/; revision=1062
Diffstat (limited to 'riscos')
-rw-r--r-- | riscos/schedule.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/riscos/schedule.c b/riscos/schedule.c index 52e5e2660..c055c219f 100644 --- a/riscos/schedule.c +++ b/riscos/schedule.c @@ -118,15 +118,21 @@ void schedule_remove(void (*callback)(void *p), void *p) void schedule_run(void) { struct sched_entry *entry; + void (*callback)(void *p); + void *p; os_t now; now = os_read_monotonic_time(); while (sched_queue.next && sched_queue.next->time <= now) { entry = sched_queue.next; - entry->callback(entry->p); + callback = entry->callback; + p = entry->p; sched_queue.next = entry->next; free(entry); + /* The callback may call schedule() or schedule_remove(), so + * leave the queue in a safe state. */ + callback(p); } if (sched_queue.next) { |