diff --git a/core/net/rime/ctimer.c b/core/net/rime/ctimer.c index d3554e526..0da674d93 100644 --- a/core/net/rime/ctimer.c +++ b/core/net/rime/ctimer.c @@ -33,7 +33,7 @@ * * This file is part of the Contiki operating system. * - * $Id: ctimer.c,v 1.4 2007/03/31 18:31:27 adamdunkels Exp $ + * $Id: ctimer.c,v 1.5 2007/11/13 15:13:03 nifi Exp $ */ /** @@ -50,6 +50,8 @@ LIST(ctimer_list); +static char initialized; + #define DEBUG 0 #if DEBUG #include @@ -65,8 +67,11 @@ PROCESS_THREAD(ctimer_process, ev, data) struct ctimer *c; PROCESS_BEGIN(); - list_init(ctimer_list); - + for(c = list_head(ctimer_list); c != NULL; c = c->next) { + etimer_set(&c->etimer, c->etimer.timer.interval); + } + initialized = 1; + while(1) { PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_TIMER); for(c = list_head(ctimer_list); c != NULL; c = c->next) { @@ -87,6 +92,8 @@ PROCESS_THREAD(ctimer_process, ev, data) void ctimer_init(void) { + initialized = 0; + list_init(ctimer_list); process_start(&ctimer_process, NULL); } /*---------------------------------------------------------------------------*/ @@ -98,10 +105,13 @@ ctimer_set(struct ctimer *c, clock_time_t t, c->p = PROCESS_CURRENT(); c->f = f; c->ptr = ptr; - - PROCESS_CONTEXT_BEGIN(&ctimer_process); - etimer_set(&c->etimer, t); - PROCESS_CONTEXT_END(&ctimer_process); + if(initialized) { + PROCESS_CONTEXT_BEGIN(&ctimer_process); + etimer_set(&c->etimer, t); + PROCESS_CONTEXT_END(&ctimer_process); + } else { + c->etimer.timer.interval = t; + } list_remove(ctimer_list, c); list_add(ctimer_list, c); @@ -110,9 +120,11 @@ ctimer_set(struct ctimer *c, clock_time_t t, void ctimer_reset(struct ctimer *c) { - PROCESS_CONTEXT_BEGIN(&ctimer_process); - etimer_reset(&c->etimer); - PROCESS_CONTEXT_END(&ctimer_process); + if(initialized) { + PROCESS_CONTEXT_BEGIN(&ctimer_process); + etimer_reset(&c->etimer); + PROCESS_CONTEXT_END(&ctimer_process); + } list_remove(ctimer_list, c); list_add(ctimer_list, c); @@ -121,7 +133,12 @@ ctimer_reset(struct ctimer *c) void ctimer_stop(struct ctimer *c) { - etimer_stop(&c->etimer); + if(initialized) { + etimer_stop(&c->etimer); + } else { + c->etimer.next = NULL; + c->etimer.p = PROCESS_NONE; + } list_remove(ctimer_list, c); } /*---------------------------------------------------------------------------*/