diff --git a/WheelTimer/libtimer/Course/timerlib.c b/WheelTimer/libtimer/Course/timerlib.c new file mode 100644 index 0000000..57d0ade --- /dev/null +++ b/WheelTimer/libtimer/Course/timerlib.c @@ -0,0 +1,122 @@ +/* + * ===================================================================================== + * + * Filename: timerExample.c + * + * Description: This file demonstrates the use of POSIX Timer routines + * + * Version: 1.0 + * Created: 10/12/2020 11:25:06 AM + * Revision: none + * Compiler: gcc + * + * Author: ABHISHEK SAGAR (), sachinites@gmail.com + * Organization: Juniper Networks + * + * ===================================================================================== + */ + +#include +#include +#include +#include +#include +#include "timerlib.h" + +unsigned long +timespec_to_millisec( + struct timespec *time){ + + unsigned long milli_sec = 0; + + milli_sec = time->tv_sec * 1000; + milli_sec += time->tv_nsec / 1000000; + return milli_sec; +} + +void +timer_fill_itimerspec(struct timespec *ts, + unsigned long msec) { + + memset(ts, 0, sizeof(struct timespec)); + + if(!msec) return; + + unsigned long sec = msec/1000; + ts->tv_sec = sec; + + unsigned long remaining_msec = msec % 1000; + + ts->tv_nsec = remaining_msec * (1000000); +} + +static void +timer_callback_wrapper(union sigval arg){ + + Timer_t *timer = (Timer_t *)(arg.sival_ptr); + + /* invoke the user provided callback fn */ + (timer->cb)(timer, timer->user_arg); +} + + +/* Returns NULL in timer creation fails, else + * return a pointer to Timer object*/ +Timer_t* +setup_timer( + void (*timer_cb)(Timer_t*, void *), /* Timer Callback with user data*/ + unsigned long exp_timer, /* First expiration time interval in msec */ + unsigned long sec_exp_timer, /* Subsequent expiration time interval in msec */ + uint32_t threshold, /* Max no of expirations, 0 for infinite*/ + void *user_arg, /* Arg to timer callback */ + bool exponential_backoff){ /* Is Timer Exp backoff*/ + + Timer_t *timer = calloc(1, sizeof(Timer_t)); + memset(&timer->posix_timer, 0, sizeof(Timer_t)); + + timer->user_arg = user_arg; + timer->exp_timer = exp_timer; + timer->sec_exp_timer = sec_exp_timer; + timer->cb = timer_cb; + timer->thresdhold = threshold; + timer_set_state(timer, TIMER_INIT); + timer->exponential_backoff = exponential_backoff; + + /* Sanity checks */ + assert(timer->cb); /* Mandatory */ + + + struct sigevent evp; + memset(&evp, 0, sizeof(struct sigevent)); + + evp.sigev_value.sival_ptr = (void *)(timer); + evp.sigev_notify = SIGEV_THREAD; + evp.sigev_notify_function = timer_callback_wrapper; + + int rc = timer_create (CLOCK_REALTIME, + &evp, &timer->posix_timer); + + assert(rc >= 0); + + timer_fill_itimerspec(&timer->ts.it_value, timer->exp_timer); + timer_fill_itimerspec(&timer->ts.it_interval, timer->sec_exp_timer); + + timer->exp_back_off_time = 0; + return timer; +} + +void +resurrect_timer(Timer_t *timer){ + + int rc; + rc = timer_settime(timer->posix_timer, 0, &timer->ts, NULL); + assert(rc >= 0); +} + +void +start_timer(Timer_t *timer){ + + resurrect_timer(timer); + timer_set_state(timer, TIMER_RUNNING); +} + diff --git a/WheelTimer/libtimer/Course/timerlib.h b/WheelTimer/libtimer/Course/timerlib.h index f97a791..6f8f1eb 100644 --- a/WheelTimer/libtimer/Course/timerlib.h +++ b/WheelTimer/libtimer/Course/timerlib.h @@ -56,4 +56,32 @@ typedef struct Timer_{ TIMER_STATE_T timer_state; } Timer_t; +Timer_t* +setup_timer( + void (*timer_cb)(Timer_t*, void *), /* Timer Callback with user data*/ + unsigned long exp_timer, /* First expiration time interval in msec */ + unsigned long sec_exp_timer, /* Subsequent expiration time interval in msec */ + uint32_t threshold, /* Max no of expirations, 0 for infinite*/ + void *user_arg, /* Arg to timer callback */ + bool exponential_backoff); /* Is Timer Exp backoff*/ + + +static inline TIMER_STATE_T +timer_get_current_state(Timer_t *timer){ + + 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 +start_timer(Timer_t *timer); + #endif /* __TIMER_WRAP__ */ diff --git a/WheelTimer/libtimer/Course/timerlib_test.c b/WheelTimer/libtimer/Course/timerlib_test.c new file mode 100644 index 0000000..219a5c1 --- /dev/null +++ b/WheelTimer/libtimer/Course/timerlib_test.c @@ -0,0 +1,66 @@ +#include +#include "timerlib.h" + +static void +user_defined_app_cb(Timer_t *timer, void *user_data){ + + printf("User data = %s\n", (char *)user_data); +} + +int +main(int argc, char **argv){ + + char *name = "Abhishek"; + + Timer_t *timer = setup_timer(user_defined_app_cb, 1000 , 1000, 0, name, false); + start_timer(timer); + + printf("1. Pause Timer\n"); + printf("2. Resume Timer\n"); + printf("3. Restart timer\n"); + printf("4. Reschedule timer\n"); + printf("5. Delete timer\n"); + printf("6. Cancel Timer\n"); + printf("7. Get Remaining Time\n"); + printf("8. Print Timer State\n"); + + int choice; + choice = 0; + + while(1){ + scanf("%d", &choice); + + switch(choice){ + + case 1: + //pause_timer(timer); + break; + case 2: + //resume_timer(timer); + break; + case 3: + //restart_timer(timer); + break; + case 4: + //reschedule_timer(timer, + // timer->exp_timer, + // timer->sec_exp_timer); + break; + case 5: + //delete_timer(timer); + break; + case 6: + //cancel_timer(timer); + break; + case 7: + //printf("Rem Time = %lu\n", timer_get_time_remaining_in_mill_sec(timer)); + break; + case 8: + //print_timer(timer); + break; + deafault: ; + } + } + pause(); + return 0; +} diff --git a/WheelTimer/libtimer/timerlib.c b/WheelTimer/libtimer/timerlib.c index 9ed5f62..4d0ad3c 100644 --- a/WheelTimer/libtimer/timerlib.c +++ b/WheelTimer/libtimer/timerlib.c @@ -134,7 +134,7 @@ void resurrect_timer(Timer_t *timer){ 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); }