First Sample Demo for Library test

This commit is contained in:
Abhishek Sagar
2020-10-25 13:22:01 -07:00
parent 4f0bc181b6
commit e2c26d2e35
4 changed files with 217 additions and 1 deletions

View 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);
}

View File

@@ -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__ */

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

View File

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