libosmocore 1.10.0.57-8972
Osmocom core library
|
Timer management: More...
Files | |
file | timer.h |
Osmocom timer handling routines. | |
file | timer_compat.h |
Compatibility header with some helpers. | |
file | timer.c |
file | timer_clockgettime.c |
Overriding Time: osmo_clock_gettime() | |
file | timer_clockgettime.c |
Overriding Time: osmo_clock_gettime() | |
file | timer_gettimeofday.c |
Overriding Time: osmo_gettimeofday() | |
Data Structures | |
struct | osmo_timer_list |
A structure representing a single instance of a timer. More... | |
Macros | |
#define | OSMO_SEC2MIN(sec) ((sec % (60 * 60)) / 60) |
#define | OSMO_SEC2HRS(sec) ((sec % (60 * 60 * 24)) / (60 * 60)) |
#define | OSMO_SEC2DAY(sec) ((sec % (60 * 60 * 24 * 365)) / (60 * 60 * 24)) /* we ignore leap year for simplicity */ |
#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) |
#define | timespecisset(tvp) ((tvp)->tv_sec || (tvp)->tv_nsec) |
#define | timespecclear(tvp) ((tvp)->tv_sec = (tvp)->tv_nsec = 0) |
#define | timespeccmp(a, b, CMP) |
#define | timespecadd(a, b, result) |
#define | timespecsub(a, b, result) |
Functions | |
void | osmo_timer_setup (struct osmo_timer_list *timer, void(*cb)(void *data), void *data) |
set up timer callback and data More... | |
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 (const 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... | |
int | osmo_timers_nearest_ms (void) |
Determine time between now and the nearest timer in milliseconds. More... | |
void | osmo_timers_prepare (void) |
Find the nearest time and update nearest_p. More... | |
int | osmo_timers_update (void) |
fire all timers... and remove them More... | |
int | osmo_timers_check (void) |
Check how many timers we have in the system. More... | |
int | osmo_gettimeofday (struct timeval *tv, struct timezone *tz) |
shim around gettimeofday to be able to set the time manually. More... | |
int | osmo_clock_gettime (clockid_t clk_id, struct timespec *tp) |
void | osmo_gettimeofday_override_add (time_t secs, suseconds_t usecs) |
convenience function to advance the fake time. More... | |
void | osmo_clock_override_enable (clockid_t clk_id, bool enable) |
void | osmo_clock_override_add (clockid_t clk_id, time_t secs, long nsecs) |
struct timespec * | osmo_clock_override_gettimespec (clockid_t clk_id) |
static void | __add_timer (struct osmo_timer_list *timer) |
static void | update_nearest (struct timeval *cand, struct timeval *current) |
Variables | |
bool | osmo_gettimeofday_override |
struct timeval | osmo_gettimeofday_override_time |
static __thread struct timeval | nearest |
static __thread struct timeval * | nearest_p |
static __thread struct rb_root | timer_root = RB_ROOT |
bool | osmo_gettimeofday_override = false |
struct timeval | osmo_gettimeofday_override_time = { 23, 424242 } |
Timer management:
Osmocom timer abstraction; modelled after linux kernel timers.
Internally:
#define OSMO_SEC2DAY | ( | sec | ) | ((sec % (60 * 60 * 24 * 365)) / (60 * 60 * 24)) /* we ignore leap year for simplicity */ |
#define timeradd | ( | a, | |
b, | |||
result | |||
) |
#define timerclear | ( | tvp | ) | ((tvp)->tv_sec = (tvp)->tv_usec = 0) |
#define timercmp | ( | a, | |
b, | |||
CMP | |||
) |
#define timerisset | ( | tvp | ) | ((tvp)->tv_sec || (tvp)->tv_usec) |
#define timersub | ( | a, | |
b, | |||
result | |||
) |
#define timespecadd | ( | a, | |
b, | |||
result | |||
) |
#define timespecclear | ( | tvp | ) | ((tvp)->tv_sec = (tvp)->tv_nsec = 0) |
#define timespeccmp | ( | a, | |
b, | |||
CMP | |||
) |
#define timespecisset | ( | tvp | ) | ((tvp)->tv_sec || (tvp)->tv_nsec) |
#define timespecsub | ( | a, | |
b, | |||
result | |||
) |
|
static |
References container_of, node, osmo_timer_list::node, rb_insert_color(), rb_link_node(), rb_root::rb_node, osmo_timer_list::timeout, timer_root, and timercmp.
Referenced by osmo_timer_add().
int osmo_clock_gettime | ( | clockid_t | clk_id, |
struct timespec * | tp | ||
) |
void osmo_clock_override_add | ( | clockid_t | clk_id, |
time_t | secs, | ||
long | nsecs | ||
) |
void osmo_clock_override_enable | ( | clockid_t | clk_id, |
bool | enable | ||
) |
struct timespec * osmo_clock_override_gettimespec | ( | clockid_t | clk_id | ) |
int osmo_gettimeofday | ( | struct timeval * | tv, |
struct timezone * | tz | ||
) |
shim around gettimeofday to be able to set the time manually.
To override, set osmo_gettimeofday_override == true and set the desired current time in osmo_gettimeofday_override_time.
N. B: gettimeofday() is affected by discontinuous jumps in the system time (e.g., if the system administrator manually changes the system time). Hence this should NEVER be used for elapsed time computation. Instead, osmo_clock_gettime() with CLOCK_MONOTONIC should be used for that.
References osmo_gettimeofday_override, and osmo_gettimeofday_override_time.
Referenced by _gsmtap_raw_output(), _output_buf(), osmo_timer_remaining(), osmo_timer_schedule(), osmo_timers_prepare(), and osmo_timers_update().
void osmo_gettimeofday_override_add | ( | time_t | secs, |
suseconds_t | usecs | ||
) |
convenience function to advance the fake time.
Add the given values to osmo_gettimeofday_override_time.
References osmo_gettimeofday_override_time, and timeradd.
void osmo_timer_add | ( | struct osmo_timer_list * | timer | ) |
add a new timer to the timer management
[in] | timer | the timer that should be added |
References __add_timer(), osmo_timer_list::active, INIT_LLIST_HEAD, 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
[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, llist_del_init(), llist_empty(), osmo_timer_list::node, rb_erase(), and timer_root.
Referenced by osmo_fsm_inst_free(), osmo_soft_uart_flush_rx(), osmo_soft_uart_free(), osmo_timer_add(), osmo_timers_update(), and state_chg().
int osmo_timer_pending | ( | const struct osmo_timer_list * | timer | ) |
check if given timer is still pending
[in] | timer | the to-be-checked timer |
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.
Referenced by state_chg().
int osmo_timer_remaining | ( | const struct osmo_timer_list * | timer, |
const struct timeval * | now, | ||
struct timeval * | remaining | ||
) |
compute the remaining time of a timer
[in] | timer | the to-be-checked timer |
[in] | now | the current time (NULL if not known) |
[out] | remaining | remaining time until timer fires |
This function can be used to determine the amount of time remaining until the expiration of the timer.
References osmo_gettimeofday(), osmo_timer_list::timeout, and timersub.
Referenced by state_chg().
void osmo_timer_schedule | ( | struct osmo_timer_list * | timer, |
int | seconds, | ||
int | microseconds | ||
) |
schedule a timer at a given future relative time
[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_gettimeofday(), osmo_timer_add(), osmo_timer_list::timeout, and timeradd.
Referenced by osmo_stats_tcp_set_interval(), state_chg(), stats_tcp_poll_timer_cb(), and suart_rx_ch().
void osmo_timer_setup | ( | struct osmo_timer_list * | timer, |
void(*)(void *data) | cb, | ||
void * | data | ||
) |
set up timer callback and data
[in] | timer | the timer that should be added |
[in] | cb | function to be called when timer expires |
[in] | data | pointer to data that passed to the callback function |
References osmo_timer_list::cb, data, and osmo_timer_list::data.
Referenced by __attribute__(), osmo_fsm_inst_alloc(), and osmo_soft_uart_configure().
int osmo_timers_check | ( | void | ) |
Check how many timers we have in the system.
References node, rb_first(), rb_next(), and timer_root.
struct timeval * osmo_timers_nearest | ( | void | ) |
Determine time between now and the nearest timer.
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
References nearest_p.
int osmo_timers_nearest_ms | ( | void | ) |
Determine time between now and the nearest timer in milliseconds.
References nearest_p.
void osmo_timers_prepare | ( | void | ) |
Find the nearest time and update nearest_p.
References container_of, nearest_p, node, osmo_gettimeofday(), rb_first(), osmo_timer_list::timeout, timer_root, and update_nearest().
int osmo_timers_update | ( | void | ) |
fire all timers... and remove them
References osmo_timer_list::cb, container_of, data, INIT_LLIST_HEAD, list, llist_add(), llist_for_each_entry, node, osmo_gettimeofday(), osmo_timer_del(), rb_first(), rb_next(), osmo_timer_list::timeout, timer_root, and timercmp.
|
static |
References nearest, nearest_p, timerclear, timercmp, and timersub.
Referenced by osmo_timers_prepare().
|
static |
Referenced by update_nearest().
|
static |
Referenced by osmo_timers_nearest(), osmo_timers_nearest_ms(), osmo_timers_prepare(), and update_nearest().
|
extern |
Referenced by osmo_gettimeofday().
bool osmo_gettimeofday_override = false |
Referenced by osmo_gettimeofday().
|
extern |
Referenced by osmo_gettimeofday(), and osmo_gettimeofday_override_add().
struct timeval osmo_gettimeofday_override_time = { 23, 424242 } |
Referenced by osmo_gettimeofday(), and osmo_gettimeofday_override_add().
Referenced by __add_timer(), osmo_timer_del(), osmo_timers_check(), osmo_timers_prepare(), and osmo_timers_update().