Osmocom timers

## Files

file | timer.h
| Osmocom timer handling routines.
file | timer_compat.h
| Compatibility header with some helpers.
file | timer.c

## Data Structures

struct | osmo_timer_list
| A structure representing a single instance of a timer. More...

## Macros

#define | timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
#define | timerclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0)
#define | timercmp(a, b, CMP)
#define | timeradd(a, b, result)
#define | timersub(a, b, result)

## Functions

void | osmo_timer_add (struct osmo_timer_list *timer)
| add a new timer to the timer management More...
void | osmo_timer_schedule (struct osmo_timer_list *timer, int seconds, int microseconds)
| schedule a timer at a given future relative time More...
void | osmo_timer_del (struct osmo_timer_list *timer)
| delete a timer from timer management More...
int | osmo_timer_pending (struct osmo_timer_list *timer)
| check if given timer is still pending More...
int | osmo_timer_remaining (const struct osmo_timer_list *timer, const struct timeval *now, struct timeval *remaining)
| compute the remaining time of a timer More...
struct timeval * | osmo_timers_nearest (void)
| Determine time between now and the nearest timer. More...
void | osmo_timers_prepare (void)
| Find the nearest time and update nearest_p.
int | osmo_timers_update (void)
| fire all timers... and remove them
int | osmo_timers_check (void)
static void | __add_timer (struct osmo_timer_list *timer)
static void | update_nearest (struct timeval *cand, struct timeval *current)

## Variables

static struct timeval | nearest
static struct timeval * | nearest_p
static struct rb_root | timer_root = RB_ROOT

## Detailed Description

## Macro Definition Documentation

#define timeradd | ( |  | a,
|  |  | b,
|  |  | result
| ) |  |

Value:
do { \
(result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \
(result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \
if ((result)->tv_usec >= 1000000) \
{ \
++(result)->tv_sec; \
(result)->tv_usec -= 1000000; \
} \
} while (0)

#define timercmp | ( |  | a,
|  |  | b,
|  |  | CMP
| ) |  |

Value:
(((a)->tv_sec == (b)->tv_sec) ? \
((a)->tv_usec CMP (b)->tv_usec) : \
((a)->tv_sec CMP (b)->tv_sec))

#define timersub | ( |  | a,
|  |  | b,
|  |  | result
| ) |  |

Value:
do { \
(result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
(result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
if ((result)->tv_usec < 0) { \
--(result)->tv_sec; \
(result)->tv_usec += 1000000; \
} \
} while (0)

## Function Documentation

void osmo_timer_add | ( | struct osmo_timer_list * | timer | ) |

add a new timer to the timer management

timer management

Parameters

  [in] | timer | the timer that should be added

References osmo_timer_list::active, osmo_timer_list::list, and osmo_timer_del().

Referenced by osmo_timer_schedule().

void osmo_timer_del | ( | struct osmo_timer_list * | timer | ) |

delete a timer from timer management

Parameters

  [in] | timer | the to-be-deleted timer

This function can be used to delete a previously added/scheduled timer from the timer management code.

References osmo_timer_list::active, osmo_timer_list::list, and osmo_timer_list::node.

Referenced by osmo_timer_add(), and osmo_timers_update().

int osmo_timer_pending | ( | struct osmo_timer_list * | timer | ) |

check if given timer is still pending

Parameters

  [in] | timer | the to-be-checked timer

Returns
  1 if pending, 0 otherwise

This function can be used to determine whether a given timer has alredy expired (returns 0) or is still pending (returns 1)

References osmo_timer_list::active.

int osmo_timer_remaining | ( | const struct osmo_timer_list * | timer,
|  | const struct timeval * | now,
|  | struct timeval * | remaining
| ) |  |

compute the remaining time of a timer

Parameters

  [in] | timer | the to-be-checked timer
  [in] | now | the current time (NULL if not known)
  [out] | remaining | remaining time until timer fires

Returns
  0 if timer has not expired yet, -1 if it has

This function can be used to determine the amount of time remaining until the expiration of the timer.

References osmo_timer_list::timeout.

void osmo_timer_schedule | ( | struct osmo_timer_list * | timer,
|  | int | seconds,
|  | int | microseconds
| ) |  |

schedule a timer at a given future relative time

Parameters

  [in] | timer | the to-be-added timer
  [in] | seconds | number of seconds from now
  [in] | microseconds | number of microseconds from now

This function can be used to (re-)schedule a given timer at a specified number of seconds+microseconds in the future. It will internally add it to the timer management data structures, thus osmo_timer_add() is automatically called.

References osmo_timer_add(), and osmo_timer_list::timeout.

Referenced by rate_ctr_difference(), and rate_ctr_init().

struct timeval * osmo_timers_nearest | ( | void |  | ) |

Determine time between now and the nearest timer.

Returns
  pointer to timeval of nearest timer, NULL if there is none

if we have a nearest time return the delta between the current time and the time of the nearest timer. If the nearest timer timed out return NULL and then we will dispatch everything after the select

Referenced by osmo_select_main().