summaryrefslogtreecommitdiff
path: root/framebuffer
diff options
context:
space:
mode:
authorVincent Sanders <vince@netsurf-browser.org>2009-03-24 14:11:10 +0000
committerVincent Sanders <vince@netsurf-browser.org>2009-03-24 14:11:10 +0000
commitd471e0fd25701742242ef81459e6dc7f45e2d85a (patch)
tree6e2624095ec51dd0615a1230c03f0d1ed12d3300 /framebuffer
parentda3b0227a73a0cefab60eef1bc6cd11382386d5f (diff)
downloadnetsurf-d471e0fd25701742242ef81459e6dc7f45e2d85a.tar.gz
netsurf-d471e0fd25701742242ef81459e6dc7f45e2d85a.tar.bz2
Fix framebufefr port callback scheduling
svn path=/trunk/netsurf/; revision=6838
Diffstat (limited to 'framebuffer')
-rw-r--r--framebuffer/fb_schedule.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/framebuffer/fb_schedule.c b/framebuffer/fb_schedule.c
index b96a00500..782210202 100644
--- a/framebuffer/fb_schedule.c
+++ b/framebuffer/fb_schedule.c
@@ -58,10 +58,10 @@ void schedule(int cs_ival, void (*callback)(void *p), void *p)
tv.tv_sec = 0;
tv.tv_usec = cs_ival * 10000;
- LOG(("adding callback %p, %p at %d cs", callback, p, cs_ival));
-
nscb = calloc(1, sizeof(struct nscallback));
+ LOG(("adding callback %p for %p(%p) at %d cs", nscb, callback, p, cs_ival));
+
gettimeofday(&nscb->tv, NULL);
timeradd(&nscb->tv, &tv, &nscb->tv);
@@ -101,8 +101,8 @@ void schedule_remove(void (*callback)(void *p), void *p)
(cur_nscb->p == p)) {
/* item to remove */
- LOG(("removing %p(%p)",
- cur_nscb->callback, cur_nscb->p));
+ LOG(("callback entry %p removing %p(%p)",
+ cur_nscb, cur_nscb->callback, cur_nscb->p));
/* remove callback */
unlnk_nscb = cur_nscb;
@@ -147,20 +147,26 @@ bool schedule_run(void)
/* remove callback */
unlnk_nscb = cur_nscb;
- cur_nscb = unlnk_nscb->next;
if (prev_nscb == NULL) {
- schedule_list = cur_nscb;
+ schedule_list = unlnk_nscb->next;
} else {
- prev_nscb->next = cur_nscb;
+ prev_nscb->next = unlnk_nscb->next;
}
- LOG(("calling %p with %p",
- unlnk_nscb->callback, unlnk_nscb->p));
+ LOG(("callback entry %p running %p(%p)",
+ unlnk_nscb, unlnk_nscb->callback, unlnk_nscb->p));
/* call callback */
unlnk_nscb->callback(unlnk_nscb->p);
free (unlnk_nscb);
+
+ /* the callback might have modded the list, so start
+ * again
+ */
+ cur_nscb = schedule_list;
+ prev_nscb = NULL;
+
} else {
/* move to next element */
prev_nscb = cur_nscb;