From 6d8d762ac3ce0ffe29442f05b854a1b7dcd5c577 Mon Sep 17 00:00:00 2001 From: Abhishek Sagar Date: Thu, 4 May 2017 02:02:17 +0530 Subject: [PATCH] Added de-register and re-schedule capabilities to Wheel timer --- WheelTimer/WheelTimer.c | 34 +++++++++++++++++++++++--- WheelTimer/WheelTimer.h | 13 ++++++---- WheelTimer/main.c | 54 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 88 insertions(+), 13 deletions(-) diff --git a/WheelTimer/WheelTimer.c b/WheelTimer/WheelTimer.c index 7dabc73..a5f467c 100644 --- a/WheelTimer/WheelTimer.c +++ b/WheelTimer/WheelTimer.c @@ -30,6 +30,15 @@ init_wheel_timer(int wheel_size, int clock_tic_interval){ return wt; } +void +de_register_app_event(wheel_timer_t *wt, wheel_timer_elem_t *wt_elem){ + if(!wt_elem) return; + pause_wheel_timer(wt); + wt_elem->is_alive = 0; + free(wt_elem->arg); + resume_wheel_timer(wt); +} + static void* wheel_fn(void *arg){ @@ -58,7 +67,15 @@ wheel_fn(void *arg){ printf("\n"); for(i = 0; i < node_count; i++){ next_node = GET_NEXT_NODE_SINGLY_LL(head); - wt_elem = (wheel_timer_elem_t *)head->data; + wt_elem = (wheel_timer_elem_t *)head->data; + + if(wt_elem->is_alive == 0){ + singly_ll_remove_node(slot_list, head); + free(head); + head = next_node; + continue; + } + if(wt->current_cycle_no == wt_elem->execute_cycle_no){ wt_elem->app_callback(wt_elem->arg, wt_elem->arg_size); if(wt_elem->is_recurrence){ @@ -85,7 +102,7 @@ wheel_fn(void *arg){ return NULL; } -void +wheel_timer_elem_t * register_app_event(wheel_timer_t *wt, app_call_back call_back, void *arg, @@ -93,7 +110,7 @@ register_app_event(wheel_timer_t *wt, int time_interval, char is_recursive){ - if(!wt || !call_back) return ; + if(!wt || !call_back) return NULL; wheel_timer_elem_t *wt_elem = calloc(1, sizeof(wheel_timer_elem_t)); wt_elem->time_interval = time_interval; @@ -111,11 +128,13 @@ register_app_event(wheel_timer_t *wt, int cycle_no = registration_next_abs_slot / wt->wheel_size; int slot_no = registration_next_abs_slot % wt->wheel_size; wt_elem->execute_cycle_no = cycle_no; + wt_elem->is_alive = 1; singly_ll_add_node_by_val(wt->slots[slot_no], wt_elem); //printf("Wheel Timer snapshot on New Registration\n"); //print_wheel_timer(wt); resume_wheel_timer(wt); + return wt_elem; } void @@ -188,3 +207,12 @@ void resume_wheel_timer(wheel_timer_t *wt){ signal_t(wt->wheel_thread); } + +void +wt_elem_reschedule(wheel_timer_elem_t *wt_elem, int new_time_interval){ + if(!wt_elem) return; + if(new_time_interval <= 0) + return; + + wt_elem->time_interval = new_time_interval; +} diff --git a/WheelTimer/WheelTimer.h b/WheelTimer/WheelTimer.h index 9e9a82b..251c199 100644 --- a/WheelTimer/WheelTimer.h +++ b/WheelTimer/WheelTimer.h @@ -13,6 +13,8 @@ struct _wheel_timer_elem_t{ void *arg; int arg_size; char is_recurrence; + /* control param*/ + char is_alive; }; @@ -34,7 +36,7 @@ init_wheel_timer(int wheel_size, int clock_tic_interval); void cleanup_wheel_timer(wheel_timer_t *wt); -void +wheel_timer_elem_t * register_app_event(wheel_timer_t *wt, app_call_back call_back, void *arg, @@ -42,11 +44,12 @@ register_app_event(wheel_timer_t *wt, int time_interval, char is_recursive); -int -unregister_app_event(wheel_timer_t *wt, - app_call_back call_back, - int time_interval); +void +de_register_app_event(wheel_timer_t *wt, wheel_timer_elem_t *wt_elem); + +void +wt_elem_reschedule(wheel_timer_elem_t *wt_elem, int new_time_interval); void free_wheel_timer_element(wheel_timer_elem_t *wt_elem); diff --git a/WheelTimer/main.c b/WheelTimer/main.c index 4ddeaaa..41ca9bc 100644 --- a/WheelTimer/main.c +++ b/WheelTimer/main.c @@ -49,6 +49,10 @@ void wrapper_generate_ospf_hello(void *arg, int arg_size){ void main_menu(wheel_timer_t *wt){ + wheel_timer_elem_t *gq_wt_elem = NULL, + *pim_hello_wt_elem = NULL, + *ospf_hello_wt_elem = NULL; + do{ printf("\nMain Menu\n"); printf("*************\n"); @@ -57,10 +61,50 @@ main_menu(wheel_timer_t *wt){ printf("3. Register Pim Hello Event\n"); printf("4. Register Ospf Hello Event\n"); printf("5. Reset Wheel Timer\n"); - printf("6. Exit\n"); + printf("6. de-Register General Query Event\n"); + printf("7. de-Register Pim Hello Event\n"); + printf("8. de-Register Ospf Hello Event\n"); + printf("9. Exit\n"); + printf("10. Reschedule general query\n"); + printf("11. Reschedule pim hello\n"); + printf("12. Reschedule ospf hello\n"); + int choice; scanf("%d", &choice); switch(choice){ + case 10: + { + int new_time_interval = 0; + printf("Enter new time interval : "); + scanf("%d", &new_time_interval); + wt_elem_reschedule(gq_wt_elem, new_time_interval); + } + break; + case 11: + { + int new_time_interval = 0; + printf("Enter new time interval : "); + scanf("%d", &new_time_interval); + wt_elem_reschedule(pim_hello_wt_elem, new_time_interval); + } + break; + case 12: + { + int new_time_interval = 0; + printf("Enter new time interval : "); + scanf("%d", &new_time_interval); + wt_elem_reschedule(ospf_hello_wt_elem, new_time_interval); + } + break; + case 6: + de_register_app_event(wt, gq_wt_elem); + break; + case 7: + de_register_app_event(wt, pim_hello_wt_elem); + break; + case 8: + de_register_app_event(wt, ospf_hello_wt_elem); + break; case 1: print_wheel_timer(wt); break; @@ -75,7 +119,7 @@ main_menu(wheel_timer_t *wt){ int time_interval; printf("time_interval ? "); scanf("%d", &time_interval); - register_app_event(wt, wrapper_generate_general_query, + gq_wt_elem = register_app_event(wt, wrapper_generate_general_query, (void *)&vlan_no, sizeof(vlan_no), time_interval, is_recursive); } @@ -91,7 +135,7 @@ main_menu(wheel_timer_t *wt){ int time_interval; printf("time_interval ? "); scanf("%d", &time_interval); - register_app_event(wt, wrapper_generate_pim_hello, + pim_hello_wt_elem = register_app_event(wt, wrapper_generate_pim_hello, (void *)&vlan_no, sizeof(vlan_no), time_interval, is_recursive); } @@ -107,7 +151,7 @@ main_menu(wheel_timer_t *wt){ int time_interval; printf("time_interval ? "); scanf("%d", &time_interval); - register_app_event(wt, wrapper_generate_ospf_hello, + ospf_hello_wt_elem = register_app_event(wt, wrapper_generate_ospf_hello, (void *)&vlan_no, sizeof(vlan_no), time_interval, is_recursive); } @@ -116,7 +160,7 @@ main_menu(wheel_timer_t *wt){ case 5: reset_wheel_timer(wt); break; - case 6: + case 9: exit(0); default: break;