mirror of
https://github.com/Hizenberg469/WheelTimer.git
synced 2026-04-19 18:52:22 +03:00
First Sample Demo for Library test
This commit is contained in:
122
WheelTimer/libtimer/Course/timerlib.c
Normal file
122
WheelTimer/libtimer/Course/timerlib.c
Normal file
@@ -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 <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <memory.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#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);
|
||||
}
|
||||
|
||||
@@ -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__ */
|
||||
|
||||
66
WheelTimer/libtimer/Course/timerlib_test.c
Normal file
66
WheelTimer/libtimer/Course/timerlib_test.c
Normal file
@@ -0,0 +1,66 @@
|
||||
#include <stdio.h>
|
||||
#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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user