61 #include <amxc/amxc.h>
62 #include <amxc/amxc_macros.h>
76 struct timeval elapsed = { 0, 0 };
83 getitimer(ITIMER_REAL, &ti);
84 if(timerisset(&ti.it_value)) {
85 timersub(&
current, &ti.it_value, &elapsed);
104 if(!timerisset(smallest) || timercmp(smallest, &timer->
timer.it_value, >)) {
105 (*smallest) = timer->
timer.it_value;
111 struct timeval* smallest,
112 struct timeval* elapsed) {
113 timersub(&timer->
timer.it_value, elapsed, &timer->
timer.it_value);
114 if(!((timer->
timer.it_value.tv_sec < 0) ||
115 !timerisset(&timer->
timer.it_value))) {
118 if(!timerisset(smallest) ||
119 timercmp(smallest, &timer->
timer.it_value, >)) {
120 (*smallest) = timer->
timer.it_value;
130 if(timerisset(&timer->
timer.it_interval)) {
131 timer->
timer.it_value = timer->
timer.it_interval;
133 if(!timerisset(smallest) ||
134 timercmp(smallest, &timer->
timer.it_value, >)) {
135 (*smallest) = timer->
timer.it_value;
145 struct timeval elapsed = { 0, 0 };
146 bool active_timer =
false;
148 struct timeval smallest;
152 timerclear(&smallest);
155 amxc_llist_for_each(it, (&
timers)) {
172 timerclear(&ti.it_interval);
177 ti.it_value.tv_sec = 0;
178 ti.it_value.tv_usec = 0;
180 setitimer(ITIMER_REAL, &ti, NULL);
184 static uint32_t recursive = 0;
186 amxc_llist_it_t* it = NULL;
191 it = amxc_llist_get_first(&
timers);
199 it = amxc_llist_it_get_next(&timer->
it);
205 if(timerisset(&timer->
timer.it_interval)) {
212 timer->
cb(timer, timer->
priv);
217 it = amxc_llist_it_get_next(&timer->
it);
232 when_null(timer, exit);
233 when_not_null(*timer, exit);
236 when_null(*timer, exit);
238 (*timer)->priv = priv;
239 amxc_llist_append(&
timers, &(*timer)->it);
248 when_null(timer, exit);
249 when_null(*timer, exit);
262 when_null(timer, exit);
272 timer->
timer.it_interval.tv_sec = msec / 1000;
273 timer->
timer.it_interval.tv_usec = (msec % 1000) * 1000;
282 unsigned int retval = 0;
284 when_null(timer, exit);
289 retval = timer->
timer.it_value.tv_sec * 1000 +
290 timer->
timer.it_value.tv_usec / 1000;
298 when_null(timer, exit);
301 if(timeout_msec == 0) {
308 timer->
timer.it_value.tv_sec = timeout_msec / 1000;
309 timer->
timer.it_value.tv_usec = (timeout_msec % 1000) * 1000;
321 when_null(timer, exit);
static struct timeval current
static amxc_llist_t timers
static void amxp_timer_free_it(amxc_llist_it_t *it)
static struct timeval amxp_timer_get_elapsed_time(void)
static void amxp_timer_update_current(struct timeval *elapsed)
static bool amxp_timer_update(amxp_timer_t *timer, struct timeval *smallest, struct timeval *elapsed)
static bool timers_enabled
static void amxp_timer_start_timer(amxp_timer_t *timer, struct timeval *smallest)
int amxp_timer_start(amxp_timer_t *timer, unsigned int timeout_msec)
Starts or resets a timer.
unsigned int amxp_timer_remaining_time(amxp_timer_t *timer)
Get the remaining time of the timer.
amxp_timer_state_t amxp_timer_get_state(amxp_timer_t *timer)
Get the timer's state.
void amxp_timers_check(void)
Check all timers and call the callback function when the timer is in Timer expired state.
void(* amxp_timer_cb_t)(amxp_timer_t *timer, void *priv)
Timer timeout callback function.
int amxp_timer_stop(amxp_timer_t *timer)
Stops the timer.
enum _amxp_timer_state amxp_timer_state_t
The timer states.
void amxp_timers_calculate(void)
Caclulates the remaining time of all timers.
void amxp_timers_enable(bool enable)
Enable or disable all timers.
void amxp_timer_delete(amxp_timer_t **timer)
Deletes a timer.
int amxp_timer_new(amxp_timer_t **timer, amxp_timer_cb_t cb, void *priv)
Allocate and initializes a new timer.
int amxp_timer_set_interval(amxp_timer_t *timer, unsigned int msec)
Sets the interval of a timer in milli seconds.