Timer : Dev Complete

This commit is contained in:
Abhishek Sagar
2020-10-13 09:25:04 -07:00
parent f2859d2b8f
commit 3df31310a9
3 changed files with 54 additions and 20 deletions

View File

@@ -71,6 +71,11 @@ timer_callback_wrapper(union sigval arg){
reschedule_timer(timer, reschedule_timer(timer,
timer->exp_back_off_time *= 2, 0); 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->sec_exp_timer = sec_exp_timer;
timer->cb = timer_cb; timer->cb = timer_cb;
timer->thresdhold = threshold; timer->thresdhold = threshold;
timer->timer_state = TIMER_INIT; timer_set_state(timer, TIMER_INIT);
timer->exponential_backoff = exponential_backoff; timer->exponential_backoff = exponential_backoff;
/* Sanity checks */ /* Sanity checks */
@@ -126,13 +131,19 @@ setup_timer(
} }
void void
start_timer(Timer_t *timer){ resurrect_timer(Timer_t *timer){
int rc; int rc;
rc = timer_settime(*(timer->posix_timer), 0, &timer->ts, NULL); rc = timer_settime(*(timer->posix_timer), 0, &timer->ts, NULL);
assert(rc >= 0); assert(rc >= 0);
timer->timer_state = TIMER_RUNNING; }
void
start_timer(Timer_t *timer){
resurrect_timer(timer);
timer_set_state(timer, TIMER_RUNNING);
} }
void void
@@ -144,14 +155,18 @@ delete_timer(Timer_t *timer){
free(timer->posix_timer); free(timer->posix_timer);
timer->posix_timer = NULL; timer->posix_timer = NULL;
timer->user_arg = NULL; /* User arg need to be freed by Appln */ timer->user_arg = NULL; /* User arg need to be freed by Appln */
timer->timer_state = TIMER_DELETED; timer_set_state(timer, TIMER_DELETED);
} }
void void
cancel_timer(Timer_t *timer){ cancel_timer(Timer_t *timer){
if(timer->timer_state == TIMER_INIT || TIMER_STATE_T timer_curr_state;
timer->timer_state == TIMER_DELETED) {
timer_curr_state = timer_get_current_state(timer);
if(timer_curr_state == TIMER_INIT ||
timer_curr_state == TIMER_DELETED) {
return; /* No-Operation */ return; /* No-Operation */
} }
@@ -161,8 +176,8 @@ cancel_timer(Timer_t *timer){
timer_fill_itimerspec(&timer->ts.it_interval, 0); timer_fill_itimerspec(&timer->ts.it_interval, 0);
timer->time_remaining = 0; timer->time_remaining = 0;
timer->invocation_counter = 0; timer->invocation_counter = 0;
start_timer(timer); resurrect_timer(timer);
timer->timer_state = TIMER_CANCELLED; 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_value, 0);
timer_fill_itimerspec(&timer->ts.it_interval, 0); timer_fill_itimerspec(&timer->ts.it_interval, 0);
start_timer(timer); resurrect_timer(timer);
timer->timer_state = TIMER_PAUSED; timer_set_state(timer, TIMER_PAUSED);
} }
void void
resume_timer(Timer_t *timer){ 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_value, timer->time_remaining);
timer_fill_itimerspec(&timer->ts.it_interval, timer->sec_exp_timer); timer_fill_itimerspec(&timer->ts.it_interval, timer->sec_exp_timer);
timer->time_remaining = 0; timer->time_remaining = 0;
start_timer(timer);
resurrect_timer(timer);
timer_set_state(timer, TIMER_RESUMED);
} }
unsigned long unsigned long
@@ -238,7 +255,8 @@ restart_timer(Timer_t *timer){
timer->invocation_counter = 0; timer->invocation_counter = 0;
timer->time_remaining = 0; timer->time_remaining = 0;
timer->exp_back_off_time = timer->exp_timer; 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){ unsigned long sec_exp_ti){
uint32_t invocation_counter; 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; invocation_counter = timer->invocation_counter;
if(timer->timer_state != TIMER_CANCELLED) { if(timer_state != TIMER_CANCELLED) {
cancel_timer(timer); cancel_timer(timer);
} }
@@ -270,7 +291,8 @@ reschedule_timer(Timer_t *timer,
} }
timer->time_remaining = 0; timer->time_remaining = 0;
start_timer(timer); resurrect_timer(timer);
timer_set_state(timer, TIMER_RUNNING);
} }
void void

View File

@@ -32,6 +32,7 @@ typedef enum{
TIMER_DELETED, TIMER_DELETED,
TIMER_PAUSED, TIMER_PAUSED,
TIMER_CANCELLED, TIMER_CANCELLED,
TIMER_RESUMED,
TIMER_RUNNING, TIMER_RUNNING,
} TIMER_STATE_T; } TIMER_STATE_T;
@@ -87,6 +88,15 @@ timer_get_current_state(Timer_t *timer){
return timer->timer_state; 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 void
start_timer(Timer_t *timer); start_timer(Timer_t *timer);

View File

@@ -7,9 +7,11 @@ app_cb(Timer_t *timer, void *user_data){
time_t t; time_t t;
time(&t); time(&t);
printf("%s ",ctime(&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, __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 int
@@ -17,7 +19,7 @@ main(int argc, char **argv){
char *name = "Abhishek"; 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); start_timer(timer);
printf("1. Pause Timer\n"); printf("1. Pause Timer\n");