diff options
author | Vincent Sanders <vince@netsurf-browser.org> | 2009-03-24 14:11:10 +0000 |
---|---|---|
committer | Vincent Sanders <vince@netsurf-browser.org> | 2009-03-24 14:11:10 +0000 |
commit | d471e0fd25701742242ef81459e6dc7f45e2d85a (patch) | |
tree | 6e2624095ec51dd0615a1230c03f0d1ed12d3300 | |
parent | da3b0227a73a0cefab60eef1bc6cd11382386d5f (diff) | |
download | netsurf-d471e0fd25701742242ef81459e6dc7f45e2d85a.tar.gz netsurf-d471e0fd25701742242ef81459e6dc7f45e2d85a.tar.bz2 |
Fix framebufefr port callback scheduling
svn path=/trunk/netsurf/; revision=6838
-rw-r--r-- | framebuffer/fb_schedule.c | 24 |
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; |