diff --git a/WheelTimer/libtimer/timerlib.c b/WheelTimer/libtimer/timerlib.c index c739162..cde4414 100644 --- a/WheelTimer/libtimer/timerlib.c +++ b/WheelTimer/libtimer/timerlib.c @@ -71,6 +71,11 @@ timer_callback_wrapper(union sigval arg){ reschedule_timer(timer, timer->exp_back_off_time *= 2, 0); } + else if(timer->timer_state == TIMER_RESUMED){ + + reschedule_timer(timer, + timer->exp_timer, timer->sec_exp_timer); + } } @@ -93,7 +98,7 @@ setup_timer( timer->sec_exp_timer = sec_exp_timer; timer->cb = timer_cb; timer->thresdhold = threshold; - timer->timer_state = TIMER_INIT; + timer_set_state(timer, TIMER_INIT); timer->exponential_backoff = exponential_backoff; /* Sanity checks */ @@ -126,13 +131,19 @@ setup_timer( } void -start_timer(Timer_t *timer){ +resurrect_timer(Timer_t *timer){ int rc; rc = timer_settime(*(timer->posix_timer), 0, &timer->ts, NULL); assert(rc >= 0); - timer->timer_state = TIMER_RUNNING; +} + +void +start_timer(Timer_t *timer){ + + resurrect_timer(timer); + timer_set_state(timer, TIMER_RUNNING); } void @@ -144,14 +155,18 @@ delete_timer(Timer_t *timer){ free(timer->posix_timer); timer->posix_timer = NULL; timer->user_arg = NULL; /* User arg need to be freed by Appln */ - timer->timer_state = TIMER_DELETED; + timer_set_state(timer, TIMER_DELETED); } void cancel_timer(Timer_t *timer){ - if(timer->timer_state == TIMER_INIT || - timer->timer_state == TIMER_DELETED) { + TIMER_STATE_T timer_curr_state; + + timer_curr_state = timer_get_current_state(timer); + + if(timer_curr_state == TIMER_INIT || + timer_curr_state == TIMER_DELETED) { return; /* No-Operation */ } @@ -161,8 +176,8 @@ cancel_timer(Timer_t *timer){ timer_fill_itimerspec(&timer->ts.it_interval, 0); timer->time_remaining = 0; timer->invocation_counter = 0; - start_timer(timer); - timer->timer_state = TIMER_CANCELLED; + resurrect_timer(timer); + timer_set_state(timer, TIMER_CANCELLED); } @@ -177,21 +192,23 @@ pause_timer(Timer_t *timer){ timer_fill_itimerspec(&timer->ts.it_value, 0); timer_fill_itimerspec(&timer->ts.it_interval, 0); - start_timer(timer); - - timer->timer_state = TIMER_PAUSED; + resurrect_timer(timer); + + timer_set_state(timer, TIMER_PAUSED); } void resume_timer(Timer_t *timer){ - assert(timer->timer_state == TIMER_PAUSED); + assert(timer_get_current_state(timer) == TIMER_PAUSED); timer_fill_itimerspec(&timer->ts.it_value, timer->time_remaining); timer_fill_itimerspec(&timer->ts.it_interval, timer->sec_exp_timer); timer->time_remaining = 0; - start_timer(timer); + + resurrect_timer(timer); + timer_set_state(timer, TIMER_RESUMED); } unsigned long @@ -238,7 +255,8 @@ restart_timer(Timer_t *timer){ timer->invocation_counter = 0; timer->time_remaining = 0; timer->exp_back_off_time = timer->exp_timer; - start_timer(timer); + resurrect_timer(timer); + timer_set_state(timer, TIMER_RUNNING); } @@ -248,12 +266,15 @@ reschedule_timer(Timer_t *timer, unsigned long sec_exp_ti){ uint32_t invocation_counter; + TIMER_STATE_T timer_state; - if(timer->timer_state == TIMER_DELETED) assert(0); + timer_state = timer_get_current_state(timer); + + if(timer_state == TIMER_DELETED) assert(0); invocation_counter = timer->invocation_counter; - if(timer->timer_state != TIMER_CANCELLED) { + if(timer_state != TIMER_CANCELLED) { cancel_timer(timer); } @@ -270,7 +291,8 @@ reschedule_timer(Timer_t *timer, } timer->time_remaining = 0; - start_timer(timer); + resurrect_timer(timer); + timer_set_state(timer, TIMER_RUNNING); } void diff --git a/WheelTimer/libtimer/timerlib.h b/WheelTimer/libtimer/timerlib.h index 6c9c78f..df7d2d7 100644 --- a/WheelTimer/libtimer/timerlib.h +++ b/WheelTimer/libtimer/timerlib.h @@ -32,6 +32,7 @@ typedef enum{ TIMER_DELETED, TIMER_PAUSED, TIMER_CANCELLED, + TIMER_RESUMED, TIMER_RUNNING, } TIMER_STATE_T; @@ -87,6 +88,15 @@ timer_get_current_state(Timer_t *timer){ return timer->timer_state; } +static inline void +timer_set_state(Timer_t *timer, TIMER_STATE_T timer_state){ + + timer->timer_state = timer_state; +} + +void +resurrect_timer(Timer_t *timer); + void start_timer(Timer_t *timer); diff --git a/WheelTimer/libtimer/timerlib_test.c b/WheelTimer/libtimer/timerlib_test.c index f70bc3a..0851826 100644 --- a/WheelTimer/libtimer/timerlib_test.c +++ b/WheelTimer/libtimer/timerlib_test.c @@ -7,9 +7,11 @@ app_cb(Timer_t *timer, void *user_data){ time_t t; time(&t); printf("%s ",ctime(&t)); - printf("%s() invoked ... name = %s, counter = %u, Threshold = %u, next fire time = %lu\n", + printf("%s() invoked ... name = %s, counter = %u, Threshold = %u," + " exp_time = %lu, sec_exp_time = %lu\n", __FUNCTION__, (char *)user_data, timer->invocation_counter, - timer->thresdhold, timespec_to_millisec(&timer->ts.it_value)); + timer->thresdhold, timespec_to_millisec(&timer->ts.it_value), + timespec_to_millisec(&timer->ts.it_interval)); } int @@ -17,7 +19,7 @@ main(int argc, char **argv){ char *name = "Abhishek"; - Timer_t *timer = setup_timer(app_cb, 1000 , 1000, 4, name, true); + Timer_t *timer = setup_timer(app_cb, 50 , 50, 0, name, true); start_timer(timer); printf("1. Pause Timer\n");