2005-04-21 16:53:53 +02:00
|
|
|
#include "timers.h"
|
|
|
|
|
|
|
|
/*===========================================================================*
|
|
|
|
* tmrs_settimer *
|
|
|
|
*===========================================================================*/
|
2005-06-17 15:47:29 +02:00
|
|
|
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 */
|
2005-06-17 15:47:29 +02:00
|
|
|
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;
|
2005-06-17 15:47:29 +02:00
|
|
|
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)
|
2005-06-17 15:47:29 +02:00
|
|
|
(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;
|
2005-06-17 15:47:29 +02:00
|
|
|
if(new_head)
|
|
|
|
(*new_head) = (*tmrs)->tmr_exp_time;
|
|
|
|
return old_head;
|
2005-04-21 16:53:53 +02:00
|
|
|
}
|
|
|
|
|