Added de-register and re-schedule capabilities to Wheel timer

This commit is contained in:
Abhishek Sagar
2017-05-04 02:02:17 +05:30
parent d38fa11385
commit 6d8d762ac3
3 changed files with 88 additions and 13 deletions

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;