libosmocore
1.6.0
Osmocom core library
|
select() loop abstraction More...
Files | |
file | select.h |
libmnl integration | |
file | select.c |
select filedescriptor handling. | |
Data Structures | |
struct | osmo_fd |
Structure representing a file dsecriptor. More... | |
struct | osmo_signalfd |
struct | poll_state |
Macros | |
#define | OSMO_FD_READ 0x0001 |
Indicate interest in reading from the file descriptor. More... | |
#define | OSMO_FD_WRITE 0x0002 |
Indicate interest in writing to the file descriptor. More... | |
#define | OSMO_FD_EXCEPT 0x0004 |
Indicate interest in exceptions from the file descriptor. More... | |
#define | OSMO_FD_MASK 0xFFFF |
Used as when_mask in osmo_fd_update_when() More... | |
#define | BSC_FD_READ OSMO_FD_READ |
#define | BSC_FD_WRITE OSMO_FD_WRITE |
#define | BSC_FD_EXCEPT OSMO_FD_EXCEPT |
Typedefs | |
typedef void | osmo_signalfd_cb(struct osmo_signalfd *osfd, const struct signalfd_siginfo *fdsi) |
Functions | |
void | osmo_fd_setup (struct osmo_fd *ofd, int fd, unsigned int when, int(*cb)(struct osmo_fd *fd, unsigned int what), void *data, unsigned int priv_nr) |
Set up an osmo-fd. More... | |
void | osmo_fd_update_when (struct osmo_fd *ofd, unsigned int when_mask, unsigned int when) |
Update the 'when' field of osmo_fd. More... | |
static void | osmo_fd_read_enable (struct osmo_fd *ofd) |
static void | osmo_fd_read_disable (struct osmo_fd *ofd) |
static void | osmo_fd_write_enable (struct osmo_fd *ofd) |
static void | osmo_fd_write_disable (struct osmo_fd *ofd) |
bool | osmo_fd_is_registered (struct osmo_fd *fd) |
Check if a file descriptor is already registered. More... | |
int | osmo_fd_register (struct osmo_fd *fd) |
Register a new file descriptor with select loop abstraction. More... | |
void | osmo_fd_unregister (struct osmo_fd *fd) |
Unregister a file descriptor from select loop abstraction. More... | |
void | osmo_fd_close (struct osmo_fd *fd) |
Close a file descriptor, mark it as closed + unregister from select loop abstraction. More... | |
int | osmo_select_main (int polling) |
select main loop integration More... | |
int | osmo_select_main_ctx (int polling) |
select main loop integration with temporary select-dispatch talloc context More... | |
void | osmo_select_init (void) |
initialize the osmocom select abstraction for the current thread More... | |
struct osmo_fd * | osmo_fd_get_by_fd (int fd) |
find an osmo_fd based on the integer fd More... | |
int | osmo_fd_fill_fds (void *_rset, void *_wset, void *_eset) |
Populate the fd_sets and return the highest fd number. More... | |
int | osmo_fd_disp_fds (void *readset, void *writeset, void *exceptset) |
int | osmo_timerfd_disable (struct osmo_fd *ofd) |
disable the osmocom-wrapped timerfd More... | |
int | osmo_timerfd_schedule (struct osmo_fd *ofd, const struct timespec *first, const struct timespec *interval) |
schedule the osmocom-wrapped timerfd to occur first at first, then periodically at interval More... | |
int | osmo_timerfd_setup (struct osmo_fd *ofd, int(*cb)(struct osmo_fd *, unsigned int), void *data) |
setup osmocom-wrapped timerfd More... | |
struct osmo_signalfd * | osmo_signalfd_setup (void *ctx, sigset_t set, osmo_signalfd_cb *cb, void *data) |
create a signalfd and register it with osmocom select loop. More... | |
void | osmo_select_shutdown_request () |
Request osmo_select_* to only service pending OSMO_FD_WRITE requests. More... | |
int | osmo_select_shutdown_requested () |
Return the number of times osmo_select_shutdown_request() was called before. More... | |
bool | osmo_select_shutdown_done () |
Return true after osmo_select_shutdown_requested() was called, and after an osmo_select poll loop found no more pending OSMO_FD_WRITE on any registered socket. More... | |
static unsigned int | poll_fill_fds (void) |
static int | poll_disp_fds (int n_fd) |
static int | _osmo_select_main (int polling) |
static | __attribute__ ((constructor)) |
static int | signalfd_callback (struct osmo_fd *ofd, unsigned int what) |
Variables | |
static __thread int | maxfd = 0 |
static __thread struct llist_head | osmo_fds |
static __thread int | unregistered_count |
static __thread struct poll_state | g_poll |
static int | _osmo_select_shutdown_requested = 0 |
See osmo_select_shutdown_request() More... | |
static bool | _osmo_select_shutdown_done = false |
See osmo_select_shutdown_request() More... | |
select() loop abstraction
#define BSC_FD_EXCEPT OSMO_FD_EXCEPT |
#define BSC_FD_READ OSMO_FD_READ |
#define BSC_FD_WRITE OSMO_FD_WRITE |
#define OSMO_FD_EXCEPT 0x0004 |
Indicate interest in exceptions from the file descriptor.
Referenced by osmo_fd_disp_fds(), osmo_fd_fill_fds(), osmo_wqueue_bfd_cb(), poll_disp_fds(), and poll_fill_fds().
#define OSMO_FD_MASK 0xFFFF |
Used as when_mask in osmo_fd_update_when()
Referenced by osmo_fd_read_enable(), and osmo_fd_write_enable().
#define OSMO_FD_READ 0x0001 |
Indicate interest in reading from the file descriptor.
Referenced by gsmtap_sink_fd_cb(), gsmtap_source_add_sink(), osmo_fd_disp_fds(), osmo_fd_fill_fds(), osmo_fd_init_ofd(), osmo_fd_read_disable(), osmo_fd_read_enable(), osmo_it_q_alloc(), osmo_it_q_fd_cb(), osmo_mnl_fd_cb(), osmo_mnl_init(), osmo_signalfd_setup(), osmo_stats_timer_cb(), osmo_timerfd_setup(), osmo_wqueue_bfd_cb(), poll_disp_fds(), and poll_fill_fds().
#define OSMO_FD_WRITE 0x0002 |
Indicate interest in writing to the file descriptor.
Referenced by log_target_create_file(), log_target_file_switch_to_wqueue(), osmo_fd_disp_fds(), osmo_fd_fill_fds(), osmo_fd_init_ofd(), osmo_fd_write_disable(), osmo_fd_write_enable(), osmo_wqueue_bfd_cb(), osmo_wqueue_clear(), osmo_wqueue_enqueue_quiet(), poll_disp_fds(), and poll_fill_fds().
typedef void osmo_signalfd_cb(struct osmo_signalfd *osfd, const struct signalfd_siginfo *fdsi) |
|
static |
References osmo_select_init().
|
static |
References _osmo_select_shutdown_requested, g_poll, maxfd, OSMO_ASSERT, osmo_ctx, osmo_fd_disp_fds(), osmo_fd_fill_fds(), osmo_timers_nearest(), osmo_timers_nearest_ms(), osmo_timers_prepare(), osmo_timers_update(), poll_state::poll, poll_disp_fds(), poll_fill_fds(), and osmo_talloc_contexts::select.
Referenced by osmo_select_main(), and osmo_select_main_ctx().
void osmo_fd_close | ( | struct osmo_fd * | fd | ) |
Close a file descriptor, mark it as closed + unregister from select loop abstraction.
[in] | fd | osmocom file descriptor to be unregistered + closed |
If fd is registered, we unregister it from the select() loop abstraction. We then close the fd and set it to -1, as well as unsetting any 'when' flags
References osmo_fd::fd, osmo_fd_is_registered(), osmo_fd_unregister(), and osmo_fd::when.
Referenced by osmo_fd_write_disable(), osmo_it_q_alloc(), and osmo_it_q_destroy().
|
inline |
References osmo_fd::cb, osmo_fd::fd, flags, osmo_fd::list, llist_for_each_entry_safe, log_reset_context(), OSMO_FD_EXCEPT, OSMO_FD_READ, OSMO_FD_WRITE, osmo_fds, and unregistered_count.
Referenced by _osmo_select_main(), and osmo_fd_write_disable().
|
inline |
Populate the fd_sets and return the highest fd number.
[in] | _rset | The readfds to populate |
[in] | _wset | The wrtiefds to populate |
[in] | _eset | The errorfds to populate |
References osmo_fd::fd, osmo_fd::list, llist_for_each_entry, OSMO_FD_EXCEPT, OSMO_FD_READ, OSMO_FD_WRITE, osmo_fds, and osmo_fd::when.
Referenced by _osmo_select_main(), and osmo_fd_write_disable().
struct osmo_fd * osmo_fd_get_by_fd | ( | int | fd | ) |
find an osmo_fd based on the integer fd
[in] | fd | file descriptor to use as search key |
References osmo_fd::fd, osmo_fd::list, llist_for_each_entry, and osmo_fds.
Referenced by osmo_fd_write_disable(), and poll_disp_fds().
bool osmo_fd_is_registered | ( | struct osmo_fd * | fd | ) |
Check if a file descriptor is already registered.
[in] | fd | osmocom file descriptor to be checked |
References osmo_fd::list, llist_for_each_entry, and osmo_fds.
Referenced by osmo_fd_close(), osmo_fd_register(), and osmo_fd_write_disable().
|
inlinestatic |
References OSMO_FD_READ, and osmo_fd_update_when().
|
inlinestatic |
References OSMO_FD_MASK, OSMO_FD_READ, and osmo_fd_update_when().
int osmo_fd_register | ( | struct osmo_fd * | fd | ) |
Register a new file descriptor with select loop abstraction.
[in] | fd | osmocom file descriptor to be registered |
References osmo_fd::fd, flags, g_poll, osmo_fd::list, llist_add_tail(), maxfd, poll_state::num_registered, osmo_fd_is_registered(), osmo_fds, OTC_GLOBAL, poll_state::poll, and poll_state::poll_size.
Referenced by gsmtap_source_add_sink(), gsmtap_source_init(), log_target_create_file(), log_target_file_reopen(), log_target_file_switch_to_wqueue(), osmo_fd_init_ofd(), osmo_fd_write_disable(), osmo_mnl_init(), osmo_signalfd_setup(), and osmo_timerfd_setup().
void osmo_fd_setup | ( | struct osmo_fd * | ofd, |
int | fd, | ||
unsigned int | when, | ||
int(*)(struct osmo_fd *fd, unsigned int what) | cb, | ||
void * | data, | ||
unsigned int | priv_nr | ||
) |
Set up an osmo-fd.
Will not register it.
[in,out] | ofd | Osmo FD to be set-up |
[in] | fd | OS-level file descriptor number |
[in] | when | bit-mask of OSMO_FD_{READ,WRITE,EXECEPT} |
[in] | cb | Call-back function to be called |
[in] | data | Private context pointer |
[in] | priv_nr | Private number |
References osmo_fd::cb, data, osmo_fd::data, osmo_fd::fd, osmo_fd::priv_nr, and osmo_fd::when.
Referenced by osmo_it_q_alloc(), osmo_mnl_init(), and osmo_signalfd_setup().
void osmo_fd_unregister | ( | struct osmo_fd * | fd | ) |
Unregister a file descriptor from select loop abstraction.
[in] | fd | osmocom file descriptor to be unregistered |
References g_poll, osmo_fd::list, llist_del(), poll_state::num_registered, and unregistered_count.
Referenced by log_target_destroy(), log_target_file_reopen(), log_target_file_switch_to_stream(), osmo_fd_close(), osmo_fd_write_disable(), osmo_mnl_destroy(), osmo_timerfd_setup(), and signalfd_callback().
void osmo_fd_update_when | ( | struct osmo_fd * | ofd, |
unsigned int | when_mask, | ||
unsigned int | when | ||
) |
Update the 'when' field of osmo_fd.
"ofd->when = (ofd->when & when_mask) | when". Use this function instead of directly modifying ofd->when, as the latter will be removed soon.
References osmo_fd::when.
Referenced by osmo_fd_read_disable(), osmo_fd_read_enable(), osmo_fd_write_disable(), and osmo_fd_write_enable().
|
inlinestatic |
References osmo_fd::cb, osmo_fd::data, osmo_fd_close(), osmo_fd_disp_fds(), osmo_fd_fill_fds(), osmo_fd_get_by_fd(), osmo_fd_is_registered(), osmo_fd_register(), osmo_fd_unregister(), osmo_fd_update_when(), OSMO_FD_WRITE, osmo_select_init(), osmo_select_main(), osmo_select_main_ctx(), osmo_timerfd_disable(), osmo_timerfd_schedule(), and osmo_timerfd_setup().
|
inlinestatic |
References OSMO_FD_MASK, osmo_fd_update_when(), and OSMO_FD_WRITE.
void osmo_select_init | ( | void | ) |
initialize the osmocom select abstraction for the current thread
References INIT_LLIST_HEAD, and osmo_fds.
Referenced by __attribute__(), and osmo_fd_write_disable().
int osmo_select_main | ( | int | polling | ) |
select main loop integration
[in] | polling | should we pollonly (1) or block on select (0) |
References _osmo_select_main(), osmo_ctx, osmo_panic(), and osmo_talloc_contexts::select.
Referenced by osmo_fd_write_disable().
int osmo_select_main_ctx | ( | int | polling | ) |
select main loop integration with temporary select-dispatch talloc context
[in] | polling | should we pollonly (1) or block on select (0) |
References _osmo_select_main(), osmo_ctx, and osmo_talloc_contexts::select.
Referenced by osmo_fd_write_disable().
bool osmo_select_shutdown_done | ( | ) |
Return true after osmo_select_shutdown_requested() was called, and after an osmo_select poll loop found no more pending OSMO_FD_WRITE on any registered socket.
References _osmo_select_shutdown_done.
void osmo_select_shutdown_request | ( | ) |
Request osmo_select_* to only service pending OSMO_FD_WRITE requests.
Once all writes are done, osmo_select_shutdown_done() returns true. This allows for example to send all outbound packets before terminating the process.
Usage example:
static void signal_handler(int signum) { fprintf(stdout, "signal %u received\n", signum);
switch (signum) { case SIGINT: case SIGTERM: // If the user hits Ctrl-C the third time, just terminate immediately. if (osmo_select_shutdown_requested() >= 2) exit(-1); // Request write-only mode in osmo_select_main_ctx() osmo_select_shutdown_request(); break; [...] }
main() { signal(SIGINT, &signal_handler); signal(SIGTERM, &signal_handler);
[...]
// After the signal_handler issued osmo_select_shutdown_request(), osmo_select_shutdown_done() returns true // as soon as all write queues are empty. while (!osmo_select_shutdown_done()) { osmo_select_main_ctx(0); } }
References _osmo_select_shutdown_requested.
int osmo_select_shutdown_requested | ( | ) |
Return the number of times osmo_select_shutdown_request() was called before.
References _osmo_select_shutdown_requested.
struct osmo_signalfd * osmo_signalfd_setup | ( | void * | ctx, |
sigset_t | set, | ||
osmo_signalfd_cb * | cb, | ||
void * | data | ||
) |
create a signalfd and register it with osmocom select loop.
[in] | ctx | talloc context from which osmo_signalfd is to be allocated |
[in] | set | of signals to be accept via this file descriptor |
[in] | cb | call-back function to be called for each arriving signal |
[in] | data | opaque user-provided data to pass to callback |
References osmo_signalfd::cb, data, osmo_signalfd::data, osmo_signalfd::ofd, OSMO_FD_READ, osmo_fd_register(), osmo_fd_setup(), signalfd_callback(), and osmo_signalfd::sigset.
int osmo_timerfd_disable | ( | struct osmo_fd * | ofd | ) |
disable the osmocom-wrapped timerfd
References osmo_fd::fd.
Referenced by osmo_fd_write_disable(), and start_timer().
int osmo_timerfd_schedule | ( | struct osmo_fd * | ofd, |
const struct timespec * | first, | ||
const struct timespec * | interval | ||
) |
schedule the osmocom-wrapped timerfd to occur first at first, then periodically at interval
[in] | ofd | Osmocom wrapped timerfd |
[in] | first | Relative time at which the timer should first execute (NULL = interval) |
[in] | interval | Time interval at which subsequent timer shall fire |
References osmo_fd::fd.
Referenced by osmo_fd_write_disable(), and start_timer().
int osmo_timerfd_setup | ( | struct osmo_fd * | ofd, |
int(*)(struct osmo_fd *, unsigned int) | cb, | ||
void * | data | ||
) |
setup osmocom-wrapped timerfd
[in,out] | ofd | Osmocom-wrapped timerfd on which to operate |
[in] | cb | Call-back function called when timerfd becomes readable |
[in] | data | Opaque data to be passed on to call-back |
We simply initialize the data structures here, but do not yet schedule the timer.
References osmo_fd::cb, data, osmo_fd::data, osmo_fd::fd, OSMO_FD_READ, osmo_fd_register(), osmo_fd_unregister(), and osmo_fd::when.
Referenced by osmo_fd_write_disable(), and start_timer().
|
static |
References _osmo_select_shutdown_done, _osmo_select_shutdown_requested, osmo_fd::cb, flags, g_poll, log_reset_context(), OSMO_FD_EXCEPT, osmo_fd_get_by_fd(), OSMO_FD_READ, OSMO_FD_WRITE, poll_state::poll, and osmo_fd::when.
Referenced by _osmo_select_main().
|
static |
References osmo_fd::fd, g_poll, osmo_fd::list, llist_for_each_entry, OSMO_FD_EXCEPT, OSMO_FD_READ, OSMO_FD_WRITE, osmo_fds, poll_state::poll, and osmo_fd::when.
Referenced by _osmo_select_main().
|
static |
References osmo_signalfd::cb, osmo_fd::data, osmo_fd::fd, and osmo_fd_unregister().
Referenced by osmo_signalfd_setup().
|
static |
See osmo_select_shutdown_request()
Referenced by osmo_select_shutdown_done(), and poll_disp_fds().
|
static |
|
static |
Referenced by _osmo_select_main(), osmo_fd_register(), osmo_fd_unregister(), poll_disp_fds(), and poll_fill_fds().
|
static |
Referenced by _osmo_select_main(), and osmo_fd_register().
|
static |
|
static |
Referenced by osmo_fd_disp_fds(), and osmo_fd_unregister().