From 8a94c69a80c18a2226e512a8c2628582476dc6a2 Mon Sep 17 00:00:00 2001 From: Ashish Gupta Date: Fri, 22 Sep 2017 00:28:30 +0200 Subject: Fix polling --- frontends/kolibrios/fb/schedule.c | 121 ++++++++++++++------------------------ 1 file changed, 43 insertions(+), 78 deletions(-) (limited to 'frontends') diff --git a/frontends/kolibrios/fb/schedule.c b/frontends/kolibrios/fb/schedule.c index 703c14d48..044899a21 100644 --- a/frontends/kolibrios/fb/schedule.c +++ b/frontends/kolibrios/fb/schedule.c @@ -15,41 +15,13 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#if defined(_TARGET_IS_KOLIBRIOS) - -#define timerclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0) -#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) -#define timercmp(tvp, uvp, cmp) \ - (((tvp)->tv_sec == (uvp)->tv_sec) ? \ - ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ - ((tvp)->tv_sec cmp (uvp)->tv_sec)) -#define timeradd(tvp, uvp, vvp) \ - do { \ - (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ - (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ - if ((vvp)->tv_usec >= 1000000) { \ - (vvp)->tv_sec++; \ - (vvp)->tv_usec -= 1000000; \ - } \ - } while (0) -#define timersub(tvp, uvp, vvp) \ - do { \ - (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ - (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ - if ((vvp)->tv_usec < 0) { \ - (vvp)->tv_sec--; \ - (vvp)->tv_usec += 1000000; \ - } \ - } while (0) - -#endif #include #include #include "utils/sys_time.h" #include "utils/log.h" - +#include #include "kolibrios/fb/schedule.h" #ifdef DEBUG_SCHEDULER @@ -67,9 +39,9 @@ static struct nscallback *schedule_list = NULL; struct nscallback { struct nscallback *next; - struct timeval tv; - void (*callback)(void *p); - void *p; + uint32_t tv; + void (*callback)(void *p); + void *p; }; /** @@ -128,7 +100,6 @@ static nserror schedule_remove(void (*callback)(void *p), void *p) nserror framebuffer_schedule(int tival, void (*callback)(void *p), void *p) { struct nscallback *nscb; - struct timeval tv; nserror ret; /* ensure uniqueness of the callback and context */ @@ -137,22 +108,16 @@ nserror framebuffer_schedule(int tival, void (*callback)(void *p), void *p) return ret; } - SRLOG("Adding %p(%p) in %d", callback, p, tival); - - tv.tv_sec = tival / 1000; /* miliseconds to seconds */ - tv.tv_usec = (tival % 1000) * 1000; /* remainder to microseconds */ + LOG("Adding %p(%p) in %d", callback, p, tival); nscb = calloc(1, sizeof(struct nscallback)); - - gettimeofday(&nscb->tv, NULL); - timeradd(&nscb->tv, &tv, &nscb->tv); - + nscb->tv = get_tick_count() + tival / 10; nscb->callback = callback; nscb->p = p; - /* add to list front */ - nscb->next = schedule_list; - schedule_list = nscb; + /* add to list front */ + nscb->next = schedule_list; + schedule_list = nscb; return NSERROR_OK; } @@ -160,26 +125,26 @@ nserror framebuffer_schedule(int tival, void (*callback)(void *p), void *p) /* exported function documented in framebuffer/schedule.h */ 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; + uint32_t tv; + uint32_t nexttime; + uint32_t rettime; + struct nscallback *cur_nscb; + struct nscallback *prev_nscb; + struct nscallback *unlnk_nscb; - if (schedule_list == NULL) - return -1; + if (schedule_list == NULL) + return -1; /* reset enumeration to the start of the list */ - cur_nscb = schedule_list; - prev_nscb = NULL; + cur_nscb = schedule_list; + prev_nscb = NULL; nexttime = cur_nscb->tv; - gettimeofday(&tv, NULL); + tv = get_tick_count(); - while (cur_nscb != NULL) { - if (timercmp(&tv, &cur_nscb->tv, >)) { - /* scheduled time */ + while (cur_nscb != NULL) { + if (tv > cur_nscb->tv) { + /* scheduled time */ /* remove callback */ unlnk_nscb = cur_nscb; @@ -206,39 +171,39 @@ int schedule_run(void) /* 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; - } - } + if (nexttime > cur_nscb->tv) { + nexttime = cur_nscb->tv; + } + /* move to next element */ + prev_nscb = cur_nscb; + cur_nscb = prev_nscb->next; + } + } /* make rettime relative to now */ - timersub(&nexttime, &tv, &rettime); + rettime = tv - nexttime; - SRLOG("returning time to next event as %ldms",(rettime.tv_sec * 1000) + (rettime.tv_usec / 1000)); + /* 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); + return rettime * 10; } void list_schedule(void) { - struct timeval tv; - struct nscallback *cur_nscb; + uint32_t tv; + struct nscallback *cur_nscb; - gettimeofday(&tv, NULL); + tv = get_tick_count(); - LOG("schedule list at %ld:%ld", tv.tv_sec, tv.tv_usec); + LOG("schedule list at %u", tv); - cur_nscb = schedule_list; + cur_nscb = schedule_list; - while (cur_nscb != NULL) { - LOG("Schedule %p at %ld:%ld", cur_nscb, cur_nscb->tv.tv_sec, cur_nscb->tv.tv_usec); - cur_nscb = cur_nscb->next; - } + while (cur_nscb != NULL) { + LOG("Schedule %p at %ld", cur_nscb, cur_nscb->tv); + cur_nscb = cur_nscb->next; + } } -- cgit v1.2.3