From 87f6314dabdc2067a19e01f8b29f9ecc38ed825b Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Sat, 8 Mar 2014 14:13:27 +0000 Subject: move scheduleing into browser operation table --- windows/download.c | 21 +++++++----- windows/gui.c | 5 +-- windows/schedule.c | 96 ++++++++++++++++++++++++++++++------------------------ windows/schedule.h | 16 +++++++-- 4 files changed, 82 insertions(+), 56 deletions(-) (limited to 'windows') diff --git a/windows/download.c b/windows/download.c index 8bdff3aac..fe2a09237 100644 --- a/windows/download.c +++ b/windows/download.c @@ -27,14 +27,15 @@ #include "content/fetch.h" #include "desktop/gui.h" #include "desktop/download.h" -#include "utils/schedule.h" #include "utils/log.h" #include "utils/messages.h" #include "utils/url.h" #include "utils/utils.h" + #include "windows/download.h" #include "windows/gui.h" #include "windows/resourceid.h" +#include "windows/schedule.h" static bool downloading = false; static struct gui_download_window *download1; @@ -182,7 +183,7 @@ void nsws_download_update_label(void *p) { struct gui_download_window *w = p; if (w->hwnd == NULL) { - schedule_remove(nsws_download_update_label, p); + win32_schedule(-1, nsws_download_update_label, p); return; } HWND sub = GetDlgItem(w->hwnd, IDC_DOWNLOAD_LABEL); @@ -222,21 +223,23 @@ void nsws_download_update_label(void *p) w->time_left = NULL; } SendMessage(sub, WM_SETTEXT, (WPARAM)0, (LPARAM)label); - if (w->progress < 10000) - schedule(50, nsws_download_update_label, p); + if (w->progress < 10000) { + win32_schedule(500, nsws_download_update_label, p); + } } void nsws_download_update_progress(void *p) { struct gui_download_window *w = p; if (w->hwnd == NULL) { - schedule_remove(nsws_download_update_progress, p); + win32_schedule(-1, nsws_download_update_progress, p); return; } HWND sub = GetDlgItem(w->hwnd, IDC_DOWNLOAD_PROGRESS); SendMessage(sub, PBM_SETPOS, (WPARAM)(w->progress / 100), 0); - if (w->progress < 10000) - schedule(50, nsws_download_update_progress, p); + if (w->progress < 10000) { + win32_schedule(500, nsws_download_update_progress, p); + } } void nsws_download_clear_data(struct gui_download_window *w) @@ -255,8 +258,8 @@ void nsws_download_clear_data(struct gui_download_window *w) free(w->total_size); if (w->file != NULL) fclose(w->file); - schedule_remove(nsws_download_update_progress, (void *)w); - schedule_remove(nsws_download_update_label, (void *)w); + win32_schedule(-1, nsws_download_update_progress, (void *)w); + win32_schedule(-1, nsws_download_update_label, (void *)w); } diff --git a/windows/gui.c b/windows/gui.c index 92ff400ba..8270c13ff 100644 --- a/windows/gui.c +++ b/windows/gui.c @@ -78,7 +78,7 @@ void gui_window_set_scroll(struct gui_window *w, int sx, int sy); static bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy); -static void gui_poll(bool active) +static void win32_poll(bool active) { MSG Msg; /* message from system */ BOOL bRet; /* message fetch result */ @@ -1888,7 +1888,8 @@ struct gui_fetch_table *win32_fetch_table = &fetch_table; static struct gui_browser_table browser_table = { - .poll = gui_poll, + .poll = win32_poll, + .schedule = win32_schedule, }; struct gui_browser_table *win32_browser_table = &browser_table; diff --git a/windows/schedule.c b/windows/schedule.c index 3181c55e8..f819918ba 100644 --- a/windows/schedule.c +++ b/windows/schedule.c @@ -19,12 +19,17 @@ #include #include -#include "utils/schedule.h" #include "windows/schedule.h" #include "utils/log.h" #include "utils/utils.h" +#ifdef DEBUG_SCHEDULER +#define SRLOG(x) LOG(x) +#else +#define SRLOG(x) +#endif + /* linked list of scheduled callbacks */ static struct nscallback *schedule_list = NULL; @@ -40,39 +45,6 @@ struct nscallback }; -/** - * Schedule a callback. - * - * \param tival interval before the callback should be made / cs - * \param callback callback function - * \param p user parameter, passed to callback function - * - * The callback function will be called as soon as possible after t cs have - * passed. - */ -void schedule(int cs_ival, void (*callback)(void *p), void *p) -{ - struct nscallback *nscb; - struct timeval tv; - - tv.tv_sec = cs_ival / 100; /* cs to seconds */ - tv.tv_usec = (cs_ival % 100) * 10000; /* remainder to microseconds */ - - 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); - - nscb->callback = callback; - nscb->p = p; - - /* add to list front */ - nscb->next = schedule_list; - schedule_list = nscb; -} - /** * Unschedule a callback. * @@ -82,16 +54,18 @@ void schedule(int cs_ival, void (*callback)(void *p), void *p) * All scheduled callbacks matching both callback and p are removed. */ -void schedule_remove(void (*callback)(void *p), void *p) +static nserror schedule_remove(void (*callback)(void *p), void *p) { struct nscallback *cur_nscb; struct nscallback *prev_nscb; struct nscallback *unlnk_nscb; - if (schedule_list == NULL) - return; + /* check there is something on the list to remove */ + if (schedule_list == NULL) { + return NSERROR_OK; + } - LOG(("removing %p, %p", callback, p)); + SRLOG(("removing %p, %p", callback, p)); cur_nscb = schedule_list; prev_nscb = NULL; @@ -101,7 +75,7 @@ void schedule_remove(void (*callback)(void *p), void *p) (cur_nscb->p == p)) { /* item to remove */ - LOG(("callback entry %p removing %p(%p)", + SRLOG(("callback entry %p removing %p(%p)", cur_nscb, cur_nscb->callback, cur_nscb->p)); /* remove callback */ @@ -120,8 +94,44 @@ void schedule_remove(void (*callback)(void *p), void *p) cur_nscb = prev_nscb->next; } } + return NSERROR_OK; } +/* exported interface documented in windows/schedule.h */ +nserror win32_schedule(int ival, void (*callback)(void *p), void *p) +{ + struct nscallback *nscb; + struct timeval tv; + nserror ret; + + ret = schedule_remove(callback, p); + if ((ival < 0) || (ret != NSERROR_OK)) { + return ret; + } + + tv.tv_sec = ival / 1000; /* miliseconds to seconds */ + tv.tv_usec = (cs_ival % 1000) * 1000; /* remainder to microseconds */ + + nscb = calloc(1, sizeof(struct nscallback)); + if (nscb == NULL) { + return NSERROR_NOMEM; + } + + SRLOG(("adding callback %p for %p(%p) at %d cs", + nscb, callback, p, ival)); + + gettimeofday(&nscb->tv, NULL); + timeradd(&nscb->tv, &tv, &nscb->tv); + + nscb->callback = callback; + nscb->p = p; + + /* add to list front */ + nscb->next = schedule_list; + schedule_list = nscb; + + return NSERROR_OK; +} /* exported interface documented in schedule.h */ int @@ -157,7 +167,7 @@ schedule_run(void) prev_nscb->next = unlnk_nscb->next; } - LOG(("callback entry %p running %p(%p)", + SRLOG(("callback entry %p running %p(%p)", unlnk_nscb, unlnk_nscb->callback, unlnk_nscb->p)); /* call callback */ unlnk_nscb->callback(unlnk_nscb->p); @@ -190,9 +200,9 @@ schedule_run(void) /* make returned time relative to now */ timersub(&nexttime, &tv, &rettime); -#if defined(DEBUG_SCHEDULER) - LOG(("returning time to next event as %ldms",(rettime.tv_sec * 1000) + (rettime.tv_usec / 1000))); -#endif + SRLOG(("returning time to next event as %ldms", + (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000))); + /* return next event time in milliseconds (24days max wait) */ return (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000); } diff --git a/windows/schedule.h b/windows/schedule.h index e6a5d10d0..6d47b2db6 100644 --- a/windows/schedule.h +++ b/windows/schedule.h @@ -16,8 +16,20 @@ * along with this program. If not, see . */ -#ifndef FRAMEBUFFER_SCHEDULE_H -#define FRAMEBUFFER_SCHEDULE_H +#ifndef WINDOWS_SCHEDULE_H +#define WINDOWS_SCHEDULE_H + +/** + * Schedule a callback. + * + * \param ival interval before the callback should be made in ms + * \param callback callback function + * \param p user parameter, passed to callback function + * + * The callback function will be called as soon as possible after t ms have + * passed. + */ +nserror win32_schedule(int ival, void (*callback)(void *p), void *p); /** * Process scheduled callbacks up to current time. -- cgit v1.2.3