timers.c revision 3e14f97f673e8a630f076077de35afdd43dc1587
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _timer
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void (*action)(void*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic double getnow(void)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register double now;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* timeofday */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * set an alarm for <t> seconds
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic double setalarm(register double t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tnew.it_value.tv_usec = 1.e6*(t- (double)tnew.it_value.tv_sec);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(t && tnew.it_value.tv_sec==0 && tnew.it_value.tv_usec<1000)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = told.it_value.tv_sec + 1.e-6*told.it_value.tv_usec;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned seconds = (unsigned)t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(t);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* signal handler for alarm call */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static double left;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(alarm(0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tpmin && (left==0 || (tp && tpmin->wakeup < (now+left))))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void (*action)(void*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin signal(SIGALRM,(sh.sigflag[SIGALRM]&SH_SIGFAULT)?sh_fault:SIG_DFL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid *sh_timeradd(unsigned long msec,int flags,void (*action)(void*),void *handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(t<=0 || !action)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((void*)0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((void*)0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((void*)tp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * delete timer <tp>. If <tp> is NULL, all timers are deleted
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setalarm((double)0);