123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #include "stdinc.h"
- #include "dat.h"
- #include "fns.h"
- #include "error.h"
- struct Periodic {
- VtLock *lk;
- int die;
- void (*f)(void*);
- void *a;
- int msec;
- };
- static void periodicThread(void *a);
- Periodic *
- periodicAlloc(void (*f)(void*), void *a, int msec)
- {
- Periodic *p;
- p = vtMemAllocZ(sizeof(Periodic));
- p->lk = vtLockAlloc();
- p->f = f;
- p->a = a;
- p->msec = msec;
- if(p->msec < 10)
- p->msec = 10;
- vtThread(periodicThread, p);
- return p;
- }
-
- void
- periodicKill(Periodic *p)
- {
- if(p == nil)
- return;
- vtLock(p->lk);
- p->die = 1;
- vtUnlock(p->lk);
- }
- static void
- periodicFree(Periodic *p)
- {
- vtLockFree(p->lk);
- vtMemFree(p);
- }
- static void
- periodicThread(void *a)
- {
- Periodic *p = a;
- double t, ct, ts;
- vtThreadSetName("periodic");
- ct = nsec()*1e-6;
- t = ct + p->msec;
- for(;;){
- /* skip missed */
- while(t <= ct)
- t += p->msec;
-
- ts = t - ct;
- if(ts > 1000)
- ts = 1000;
- sleep(ts);
- ct = nsec()*1e-6;
- vtLock(p->lk);
- if(p->die){
- vtUnlock(p->lk);
- break;
- }
- if(t <= ct){
- p->f(p->a);
- t += p->msec;
- }
- vtUnlock(p->lk);
- }
- periodicFree(p);
- }
|