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;
|
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*
|
static void*
|
||||||
wheel_fn(void *arg){
|
wheel_fn(void *arg){
|
||||||
@@ -58,7 +67,15 @@ wheel_fn(void *arg){
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
for(i = 0; i < node_count; i++){
|
for(i = 0; i < node_count; i++){
|
||||||
next_node = GET_NEXT_NODE_SINGLY_LL(head);
|
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){
|
if(wt->current_cycle_no == wt_elem->execute_cycle_no){
|
||||||
wt_elem->app_callback(wt_elem->arg, wt_elem->arg_size);
|
wt_elem->app_callback(wt_elem->arg, wt_elem->arg_size);
|
||||||
if(wt_elem->is_recurrence){
|
if(wt_elem->is_recurrence){
|
||||||
@@ -85,7 +102,7 @@ wheel_fn(void *arg){
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
wheel_timer_elem_t *
|
||||||
register_app_event(wheel_timer_t *wt,
|
register_app_event(wheel_timer_t *wt,
|
||||||
app_call_back call_back,
|
app_call_back call_back,
|
||||||
void *arg,
|
void *arg,
|
||||||
@@ -93,7 +110,7 @@ register_app_event(wheel_timer_t *wt,
|
|||||||
int time_interval,
|
int time_interval,
|
||||||
char is_recursive){
|
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));
|
wheel_timer_elem_t *wt_elem = calloc(1, sizeof(wheel_timer_elem_t));
|
||||||
|
|
||||||
wt_elem->time_interval = time_interval;
|
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 cycle_no = registration_next_abs_slot / wt->wheel_size;
|
||||||
int slot_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->execute_cycle_no = cycle_no;
|
||||||
|
wt_elem->is_alive = 1;
|
||||||
singly_ll_add_node_by_val(wt->slots[slot_no], wt_elem);
|
singly_ll_add_node_by_val(wt->slots[slot_no], wt_elem);
|
||||||
//printf("Wheel Timer snapshot on New Registration\n");
|
//printf("Wheel Timer snapshot on New Registration\n");
|
||||||
//print_wheel_timer(wt);
|
//print_wheel_timer(wt);
|
||||||
|
|
||||||
resume_wheel_timer(wt);
|
resume_wheel_timer(wt);
|
||||||
|
return wt_elem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -188,3 +207,12 @@ void
|
|||||||
resume_wheel_timer(wheel_timer_t *wt){
|
resume_wheel_timer(wheel_timer_t *wt){
|
||||||
signal_t(wt->wheel_thread);
|
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;
|
void *arg;
|
||||||
int arg_size;
|
int arg_size;
|
||||||
char is_recurrence;
|
char is_recurrence;
|
||||||
|
/* control param*/
|
||||||
|
char is_alive;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -34,7 +36,7 @@ init_wheel_timer(int wheel_size, int clock_tic_interval);
|
|||||||
void
|
void
|
||||||
cleanup_wheel_timer(wheel_timer_t *wt);
|
cleanup_wheel_timer(wheel_timer_t *wt);
|
||||||
|
|
||||||
void
|
wheel_timer_elem_t *
|
||||||
register_app_event(wheel_timer_t *wt,
|
register_app_event(wheel_timer_t *wt,
|
||||||
app_call_back call_back,
|
app_call_back call_back,
|
||||||
void *arg,
|
void *arg,
|
||||||
@@ -42,11 +44,12 @@ register_app_event(wheel_timer_t *wt,
|
|||||||
int time_interval,
|
int time_interval,
|
||||||
char is_recursive);
|
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
|
void
|
||||||
free_wheel_timer_element(wheel_timer_elem_t *wt_elem);
|
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
|
void
|
||||||
main_menu(wheel_timer_t *wt){
|
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{
|
do{
|
||||||
printf("\nMain Menu\n");
|
printf("\nMain Menu\n");
|
||||||
printf("*************\n");
|
printf("*************\n");
|
||||||
@@ -57,10 +61,50 @@ main_menu(wheel_timer_t *wt){
|
|||||||
printf("3. Register Pim Hello Event\n");
|
printf("3. Register Pim Hello Event\n");
|
||||||
printf("4. Register Ospf Hello Event\n");
|
printf("4. Register Ospf Hello Event\n");
|
||||||
printf("5. Reset Wheel Timer\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;
|
int choice;
|
||||||
scanf("%d", &choice);
|
scanf("%d", &choice);
|
||||||
switch(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:
|
case 1:
|
||||||
print_wheel_timer(wt);
|
print_wheel_timer(wt);
|
||||||
break;
|
break;
|
||||||
@@ -75,7 +119,7 @@ main_menu(wheel_timer_t *wt){
|
|||||||
int time_interval;
|
int time_interval;
|
||||||
printf("time_interval ? ");
|
printf("time_interval ? ");
|
||||||
scanf("%d", &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);
|
(void *)&vlan_no, sizeof(vlan_no), time_interval, is_recursive);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -91,7 +135,7 @@ main_menu(wheel_timer_t *wt){
|
|||||||
int time_interval;
|
int time_interval;
|
||||||
printf("time_interval ? ");
|
printf("time_interval ? ");
|
||||||
scanf("%d", &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);
|
(void *)&vlan_no, sizeof(vlan_no), time_interval, is_recursive);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -107,7 +151,7 @@ main_menu(wheel_timer_t *wt){
|
|||||||
int time_interval;
|
int time_interval;
|
||||||
printf("time_interval ? ");
|
printf("time_interval ? ");
|
||||||
scanf("%d", &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);
|
(void *)&vlan_no, sizeof(vlan_no), time_interval, is_recursive);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -116,7 +160,7 @@ main_menu(wheel_timer_t *wt){
|
|||||||
case 5:
|
case 5:
|
||||||
reset_wheel_timer(wt);
|
reset_wheel_timer(wt);
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 9:
|
||||||
exit(0);
|
exit(0);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user