unsigned pthread_alarm(unsigned sec) { int ret = 0; pthread_t self = pthread_self(); if (sec == 0) { /* cancel pending alarm */ self->alarm_timeout = 0; if (self->alarm_timer) DosStopTimer(self->alarm_timer); if (self->alarm_event) DosPostEventSem(self->alarm_event); } else if (sec > 0) { if (self->alarm_timer && self->alarm_thread) { DosStopTimer(self->alarm_timer); } else { DosCreateEventSem(NULL,&self->alarm_event,DC_SEM_SHARED,FALSE); pthread_create(&self->alarm_thread,NULL,_alarm_thread,(void *)self); } DosAsyncTimer(sec * 1000L,(HSEM)self->alarm_event,&self->alarm_timer); self->alarm_timeout = sec; } else { ret = EINVAL; errno = EINVAL; } return (ret); }
static void vlc_timer_do (void *arg) { struct vlc_timer *timer = arg; while (1) { ULONG count; DosWaitEventSem (timer->hev, SEM_INDEFINITE_WAIT); DosResetEventSem (timer->hev, &count); if (timer->quit) break; timer->func (timer->data); if (timer->interval) DosAsyncTimer (timer->interval, (HSEM)timer->hev, &timer->htimer); } }
void vlc_timer_schedule (vlc_timer_t timer, bool absolute, mtime_t value, mtime_t interval) { if (timer->htimer != NULLHANDLE) { DosStopTimer (timer->htimer); timer->htimer = NULLHANDLE; timer->interval = 0; } if (value == 0) return; /* Disarm */ if (absolute) value -= mdate (); value = (value + 999) / 1000; interval = (interval + 999) / 1000; timer->interval = interval; if (DosAsyncTimer (value, (HSEM)timer->hev, &timer->htimer)) abort (); }