mirror of
https://github.com/Hizenberg469/WheelTimer.git
synced 2026-04-19 18:52:22 +03:00
Added de-register and re-schedule capabilities to Wheel timer
This commit is contained in:
@@ -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){
|
||||
@@ -59,6 +68,14 @@ wheel_fn(void *arg){
|
||||
for(i = 0; i < node_count; i++){
|
||||
next_node = GET_NEXT_NODE_SINGLY_LL(head);
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user