From 2fd1476f8c99c4d4f6eb114cc7b5f8ac9ab54be4 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Wed, 28 Apr 2010 22:39:37 +0000 Subject: The schedule_run function is only called by the frontends so remove it from the core header and add its definition to the frontend headers. Alter the framebuffer schedule_run to return the time untill the next event. svn path=/trunk/netsurf/; revision=10512 --- framebuffer/schedule.c | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) (limited to 'framebuffer/schedule.c') diff --git a/framebuffer/schedule.c b/framebuffer/schedule.c index 986c8e909..150ac037b 100644 --- a/framebuffer/schedule.c +++ b/framebuffer/schedule.c @@ -123,21 +123,27 @@ void schedule_remove(void (*callback)(void *p), void *p) } /** - * Process events up to current time. + * Process scheduled callbacks up to current time. + * + * @return The number of centiseconds untill the next callback or -1 for never. */ - -bool schedule_run(void) +int +schedule_run(void) { struct timeval tv; + struct timeval nexttime; + struct timeval rettime; struct nscallback *cur_nscb; struct nscallback *prev_nscb; struct nscallback *unlnk_nscb; if (schedule_list == NULL) - return false; + return -1; + /* reset enumeration to the start of the list */ cur_nscb = schedule_list; prev_nscb = NULL; + nexttime = cur_nscb->tv; gettimeofday(&tv, NULL); @@ -159,21 +165,35 @@ bool schedule_run(void) /* call callback */ unlnk_nscb->callback(unlnk_nscb->p); - free (unlnk_nscb); + free(unlnk_nscb); - /* the callback might have modded the list, so start - * again - */ + /* need to deal with callback modifying the list. */ + if (schedule_list == NULL) + return -1; /* no more callbacks scheduled */ + + /* reset enumeration to the start of the list */ cur_nscb = schedule_list; prev_nscb = NULL; - + nexttime = cur_nscb->tv; } else { + /* if the time to the event is sooner than the + * currently recorded soonest event record it + */ + if (timercmp(&nexttime, &cur_nscb->tv, >)) { + nexttime = cur_nscb->tv; + } /* move to next element */ prev_nscb = cur_nscb; cur_nscb = prev_nscb->next; } } - return true; + + /* make rettime relative to now */ + timersub(&nexttime, &tv, &rettime); + + LOG(("returning time to next event as %ldcs",(rettime.tv_sec * 100) + (rettime.tv_usec / 10000))); + /* return next event time in cs */ + return (rettime.tv_sec * 100) + (rettime.tv_usec / 10000); } void list_schedule(void) -- cgit v1.2.3