minix/lib/timers/tmrs_set.c

41 lines
1.4 KiB
C
Raw Normal View History

2005-04-21 16:53:53 +02:00
#include "timers.h"
/*===========================================================================*
* tmrs_settimer *
*===========================================================================*/
clock_t tmrs_settimer(tmrs, tp, exp_time, watchdog, new_head)
2005-04-21 16:53:53 +02:00
timer_t **tmrs; /* pointer to timers queue */
timer_t *tp; /* the timer to be added */
clock_t exp_time; /* its expiration time */
tmr_func_t watchdog; /* watchdog function to be run */
clock_t *new_head; /* new earliest timer, if non NULL */
2005-04-21 16:53:53 +02:00
{
/* Activate a timer to run function 'fp' at time 'exp_time'. If the timer is
* already in use it is first removed from the timers queue. Then, it is put
* in the list of active timers with the first to expire in front.
* The caller responsible for scheduling a new alarm for the timer if needed.
*/
timer_t **atp;
clock_t old_head = 0;
if(*tmrs)
old_head = (*tmrs)->tmr_exp_time;
2005-04-21 16:53:53 +02:00
/* Possibly remove an old timer. Then set the timer's variables. */
if (tp->tmr_exp_time != TMR_NEVER)
(void) tmrs_clrtimer(tmrs, tp, NULL);
2005-04-21 16:53:53 +02:00
tp->tmr_exp_time = exp_time;
tp->tmr_func = watchdog;
/* Add the timer to the active timers. The next timer due is in front. */
for (atp = tmrs; *atp != NULL; atp = &(*atp)->tmr_next) {
if (exp_time < (*atp)->tmr_exp_time) break;
}
tp->tmr_next = *atp;
*atp = tp;
if(new_head)
(*new_head) = (*tmrs)->tmr_exp_time;
return old_head;
2005-04-21 16:53:53 +02:00
}