libosmocore 1.11.0.26-c59d.202505092026
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_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) |
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 */ |
|
static |
References container_of, osmo_timer_list::node, rb_insert_color(), rb_link_node(), rb_root::rb_node, subsys, osmo_timer_list::timeout, timer_root, and timercmp.
Referenced by osmo_timer_add().
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, osmo_gettimeofday_override_time, and subsys.
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, subsys, 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(), subsys, 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(), subsys, osmo_timer_list::timeout, and timeradd.
Referenced by osmo_stats_tcp_set_interval(), state_chg(), stats_tcp_poll_timer_cb(), and suart_rx_ch().
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, and osmo_timer_list::data.
Referenced by __attribute__(), osmo_fsm_inst_alloc(), and osmo_soft_uart_configure().
Check how many timers we have in the system.
References node, rb_first(), rb_next(), subsys, and timer_root.
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.
Find the nearest time and update nearest_p.
References container_of, nearest_p, node, osmo_timer_list::node, osmo_gettimeofday(), rb_first(), subsys, osmo_timer_list::timeout, timer_root, and update_nearest().
fire all timers... and remove them
References osmo_timer_list::cb, container_of, osmo_timer_list::data, INIT_LLIST_HEAD, osmo_timer_list::list, llist_add(), llist_for_each_entry, node, osmo_timer_list::node, osmo_gettimeofday(), osmo_timer_del(), rb_first(), rb_next(), subsys, osmo_timer_list::timeout, timer_root, and timercmp.
References nearest, nearest_p, subsys, timerclear, timercmp, and timersub.
Referenced by osmo_timers_prepare().
Referenced by update_nearest().
Referenced by osmo_timers_nearest(), osmo_timers_nearest_ms(), osmo_timers_prepare(), and update_nearest().
|
extern |
Referenced by osmo_gettimeofday().
Referenced by osmo_gettimeofday().
Referenced by osmo_gettimeofday(), and osmo_gettimeofday_override_add().
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().