From d1c876e03ce1df47dab9c77fa5c5b7192670267d Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sun, 3 Aug 2008 16:10:10 +0000 Subject: [PATCH] Fully implemented schedule, schedule_run and schedule_remove. svn path=/trunk/netsurf/; revision=4875 --- amiga/schedule.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++- amiga/schedule.h | 31 ++++++++++++++ 2 files changed, 135 insertions(+), 1 deletion(-) create mode 100755 amiga/schedule.h diff --git a/amiga/schedule.c b/amiga/schedule.c index 8d99a8271..00380c6fb 100755 --- a/amiga/schedule.c +++ b/amiga/schedule.c @@ -17,16 +17,119 @@ */ #include "desktop/browser.h" +#include "amiga/object.h" +#include "amiga/schedule.h" +#include +#include + +/** + * Schedule a callback. + * + * \param t 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 t, void (*callback)(void *p), void *p) { - printf("adding callback %lx\n",callback); + struct nsObject *obj; + struct nscallback *nscb; + struct timeval tv; + + printf("adding callback %lx,%ld at %d cs\n",callback,p,t); + + obj = AddObject(schedule_list,AMINS_CALLBACK); + obj->objstruct_size = sizeof(struct nscallback); + obj->objstruct = AllocVec(obj->objstruct_size,MEMF_CLEAR); + + nscb = (struct nscallback *)obj->objstruct; + + nscb->tv.tv_sec = 0; + nscb->tv.tv_micro = t*10000; + GetSysTime(&tv); + AddTime(&nscb->tv,&tv); + + nscb->callback = callback; + nscb->p = p; } +/** + * Unschedule a callback. + * + * \param callback callback function + * \param p user parameter, passed to callback function + * + * All scheduled callbacks matching both callback and p are removed. + */ + void schedule_remove(void (*callback)(void *p), void *p) { + printf("remove schedule %lx,%lx\n",callback,p); + + struct nsObject *node; + struct nsObject *nnode; + struct nscallback *nscb; + + if(IsMinListEmpty(schedule_list)) return; + + node = (struct nsObject *)schedule_list->mlh_Head; + + while(nnode=(struct nsObject *)(node->dtz_Node.mln_Succ)) + { + printf("rem %lx next %lx node objtype %ld\n",node,nnode,node->Type); + + nscb = node->objstruct; + + if((nscb->callback == callback) && (nscb->p == p)) + { + DelObject(node); + } + + node=nnode; + } } +/** + * Process events up to current time. + */ + void schedule_run(void) { + struct nsObject *node; + struct nsObject *nnode; + struct nscallback *nscb; + void (*callback)(void *p); + struct timeval tv; + + if(IsMinListEmpty(schedule_list)) return; + + GetSysTime(&tv); + + node = (struct nsObject *)schedule_list->mlh_Head; + + while(nnode=(struct nsObject *)(node->dtz_Node.mln_Succ)) + { + printf("run %lx next %lx node objtype %ld\n",node,nnode,node->Type); + + if((node->Type == AMINS_CALLBACK) && (node->objstruct)) + { + nscb = node->objstruct; + + printf("%ld %ld \n%ld %ld\n",tv.tv_secs,tv.tv_micro,nscb->tv.tv_secs,nscb->tv.tv_micro); + + if(CmpTime(&tv,&nscb->tv) <= 0) + { + printf("running callback\n"); + + callback = nscb->callback; + callback(nscb->p); + DelObject(node); + } + } + + node=nnode; + } } diff --git a/amiga/schedule.h b/amiga/schedule.h new file mode 100755 index 000000000..5b8574b16 --- /dev/null +++ b/amiga/schedule.h @@ -0,0 +1,31 @@ +/* + * Copyright 2008 Chris Young + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef AMIGA_SCHEDULE_H +#define AMIGA_SCHEDULE_H +#include + +struct MinList *schedule_list; + +struct nscallback +{ + struct timeval tv; + void *callback; + void *p; +}; +#endif