da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
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* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sig.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <error.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "fault.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "defs.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/sigfeatures"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/time"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _timer
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin double wakeup;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin double incr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct _timer *next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void (*action)(void*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void *handle;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Timer_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define IN_ADDTIMEOUT 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define IN_SIGALRM 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DEFER_SIGALRM 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SIGALRM_CALL 8
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Timer_t *tptop, *tpmin, *tpfree;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char time_state;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic double getnow(void)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register double now;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef timeofday
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct timeval tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin timeofday(&tp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin now = tp.tv_sec + 1.e-6*tp.tv_usec;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin now = (double)time((time_t*)0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* timeofday */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(now+.001);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * set an alarm for <t> seconds
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic double setalarm(register double t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(_lib_setitimer) && defined(ITIMER_REAL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct itimerval tnew, told;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tnew.it_value.tv_sec = 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 tnew.it_value.tv_usec = 1000;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tnew.it_interval.tv_sec = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tnew.it_interval.tv_usec = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(setitimer(ITIMER_REAL,&tnew,&told) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(1),e_alarm);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = told.it_value.tv_sec + 1.e-6*told.it_value.tv_usec;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned seconds = (unsigned)t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(t && seconds<1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin seconds=1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = (double)alarm(seconds);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(t);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* signal handler for alarm call */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void sigalrm(int sig)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Timer_t *tp, *tplast, *tpold, *tpnext;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin double now;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static double left;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(sig);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin left = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(time_state&SIGALRM_CALL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin time_state &= ~SIGALRM_CALL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(alarm(0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_fault(SIGALRM|SH_TRAP);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(time_state)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(time_state&IN_ADDTIMEOUT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin time_state |= DEFER_SIGALRM;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errno = EINTR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin time_state |= IN_SIGALRM;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sigrelease(SIGALRM);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin now = getnow();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tpold = tpmin = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(tplast=0,tp=tptop; tp; tp=tpnext)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tpnext = tp->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp->action)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp->wakeup <=now)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!tpold || tpold->wakeup>tp->wakeup)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tpold = tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!tpmin || tpmin->wakeup>tp->wakeup)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tpmin=tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tplast = tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tplast)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tplast->next = tp->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tptop = tp->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp->next = tpfree;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tpfree = tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((tp=tpold) && tp->incr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((tp->wakeup += tp->incr) <= now);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!tpmin || tpmin->wakeup>tp->wakeup)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tpmin=tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tpmin && (left==0 || (tp && tpmin->wakeup < (now+left))))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(left==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin signal(SIGALRM,sigalrm);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin left = setalarm(tpmin->wakeup-now);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(left && (now+left) < tpmin->wakeup)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setalarm(left);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin left=tpmin->wakeup-now;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void (*action)(void*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin action = tp->action;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!tp->incr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp->action = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errno = EINTR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin time_state &= ~IN_SIGALRM;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*action)(tp->handle);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin time_state |= IN_SIGALRM;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!tpmin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin signal(SIGALRM,(sh.sigflag[SIGALRM]&SH_SIGFAULT)?sh_fault:SIG_DFL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin time_state &= ~IN_SIGALRM;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errno = EINTR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void oldalrm(void *handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Handler_t fn = *(Handler_t*)handle;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(handle);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*fn)(SIGALRM);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid *sh_timeradd(unsigned long msec,int flags,void (*action)(void*),void *handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Timer_t *tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin double t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Handler_t fn;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = ((double)msec)/1000.;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(t<=0 || !action)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((void*)0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp=tpfree)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tpfree = tp->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(!(tp=(Timer_t*)malloc(sizeof(Timer_t))))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((void*)0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp->wakeup = getnow() + t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp->incr = (flags?t:0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp->action = action;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp->handle = handle;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin time_state |= IN_ADDTIMEOUT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp->next = tptop;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tptop = tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!tpmin || tp->wakeup < tpmin->wakeup)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tpmin = tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fn = (Handler_t)signal(SIGALRM,sigalrm);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((t= setalarm(t))>0 && fn && fn!=(Handler_t)sigalrm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Handler_t *hp = (Handler_t*)malloc(sizeof(Handler_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(hp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *hp = fn;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_timeradd((long)(1000*t), 0, oldalrm, (void*)hp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp = tptop;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(tpmin && !tpmin->action)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin time_state |= DEFER_SIGALRM;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin time_state &= ~IN_ADDTIMEOUT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(time_state&DEFER_SIGALRM)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin time_state=SIGALRM_CALL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sigalrm(SIGALRM);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp!=tptop)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((void*)tp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * delete timer <tp>. If <tp> is NULL, all timers are deleted
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid timerdel(void *handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Timer_t *tp = (Timer_t*)handle;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp->action = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(tp=tptop; tp; tp=tp->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp->action = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tpmin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tpmin = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setalarm((double)0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin signal(SIGALRM,(sh.sigflag[SIGALRM]&SH_SIGFAULT)?sh_fault:SIG_DFL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin