SCCSID(@
(#)clock.c 3.13 11/28/82);
** SETEVENT -- set an event to happen at a specific time.
** Events are stored in a sorted list for fast processing.
** An event only applies to the process that set it.
** intvl -- intvl until next event occurs.
** func -- function to call on event.
** arg -- argument to func on event.
setevent(intvl
, func
, arg
)
syserr("setevent: intvl=%ld\n", intvl
);
/* search event queue for correct position */
for (evp
= &EventQueue
; (ev
= *evp
) != NULL
; evp
= &ev
->ev_link
)
if (ev
->ev_time
>= now
+ intvl
)
ev
= (EVENT
*) xalloc(sizeof *ev
);
ev
->ev_time
= now
+ intvl
;
printf("setevent: intvl=%ld, for=%ld, func=%x, arg=%d, ev=%x\n",
intvl
, now
+ intvl
, func
, arg
, ev
);
** CLREVENT -- remove an event from the event queue.
** ev -- pointer to event to remove.
** arranges for event ev to not happen.
printf("clrevent: ev=%x\n", ev
);
/* find the parent event */
(void) signal(SIGALRM
, SIG_IGN
);
for (evp
= &EventQueue
; *evp
!= NULL
; evp
= &(*evp
)->ev_link
)
/* restore clocks and pick up anything spare */
** TICK -- take a clock tick
** Called by the alarm clock. This routine runs events as needed.
** calls the next function in EventQueue.
(void) signal(SIGALRM
, SIG_IGN
);
printf("tick: now=%ld\n", now
);
while ((ev
= EventQueue
) != NULL
&&
(ev
->ev_time
<= now
|| ev
->ev_pid
!= getpid()))
/* process the event on the top of the queue */
EventQueue
= EventQueue
->ev_link
;
printf("tick: ev=%x, func=%x, arg=%d, pid=%d\n", ev
,
ev
->ev_func
, ev
->ev_arg
, ev
->ev_pid
);
/* we must be careful in here because ev_func may not return */
(void) signal(SIGALRM
, tick
);
if (ev
->ev_pid
!= getpid())
if (EventQueue
->ev_time
> now
)
(void) alarm(EventQueue
->ev_time
- now
);
(void) signal(SIGALRM
, tick
);
(void) alarm(EventQueue
->ev_time
- now
);
** SLEEP -- a version of sleep that works with this stuff
** Because sleep uses the alarm facility, I must reimplement
** intvl -- time to sleep.
** waits for intvl time. However, other events can
** be run during that interval.
(void) setevent(intvl
, endsleep
, 0);