libosmocore  1.5.1
Osmocom core library
Select loop abstraction

Files

file  select.h
 
file  select.c
 

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_fdosmo_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_signalfdosmo_signalfd_setup (void *ctx, sigset_t set, osmo_signalfd_cb *cb, void *data)
 create a signalfd and register it with osmocom select loop. 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
 

Detailed Description

select() loop abstraction

Macro Definition Documentation

◆ BSC_FD_EXCEPT

#define BSC_FD_EXCEPT   OSMO_FD_EXCEPT

◆ BSC_FD_READ

#define BSC_FD_READ   OSMO_FD_READ

◆ BSC_FD_WRITE

#define BSC_FD_WRITE   OSMO_FD_WRITE

◆ OSMO_FD_EXCEPT

#define OSMO_FD_EXCEPT   0x0004

Indicate interest in exceptions from the file descriptor.

◆ OSMO_FD_MASK

#define OSMO_FD_MASK   0xFFFF

Used as when_mask in osmo_fd_update_when()

◆ OSMO_FD_READ

#define OSMO_FD_READ   0x0001

Indicate interest in reading from the file descriptor.

◆ OSMO_FD_WRITE

#define OSMO_FD_WRITE   0x0002

Indicate interest in writing to the file descriptor.

Typedef Documentation

◆ osmo_signalfd_cb

typedef void osmo_signalfd_cb(struct osmo_signalfd *osfd, const struct signalfd_siginfo *fdsi)

Function Documentation

◆ __attribute__()

static __attribute__ ( (constructor)  )
static

References osmo_select_init().

◆ _osmo_select_main()

◆ osmo_fd_close()

void osmo_fd_close ( struct osmo_fd fd)

Close a file descriptor, mark it as closed + unregister from select loop abstraction.

Parameters
[in]fdosmocom 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_it_q_alloc(), and osmo_it_q_destroy().

◆ osmo_fd_disp_fds()

int osmo_fd_disp_fds ( void *  readset,
void *  writeset,
void *  exceptset 
)
inline

◆ osmo_fd_fill_fds()

int osmo_fd_fill_fds ( void *  _rset,
void *  _wset,
void *  _eset 
)
inline

Populate the fd_sets and return the highest fd number.

Parameters
[in]_rsetThe readfds to populate
[in]_wsetThe wrtiefds to populate
[in]_esetThe errorfds to populate
Returns
The highest file descriptor seen or 0 on an empty list

References osmo_fd::fd, list, llist_for_each_entry, OSMO_FD_EXCEPT, OSMO_FD_READ, OSMO_FD_WRITE, osmo_fds, and osmo_fd::when.

◆ osmo_fd_get_by_fd()

struct osmo_fd * osmo_fd_get_by_fd ( int  fd)

find an osmo_fd based on the integer fd

Parameters
[in]fdfile descriptor to use as search key
Returns
osmo_fd for fd; NULL in case it doesn't exist

References osmo_fd::fd, list, llist_for_each_entry, and osmo_fds.

Referenced by poll_disp_fds().

◆ osmo_fd_is_registered()

bool osmo_fd_is_registered ( struct osmo_fd fd)

Check if a file descriptor is already registered.

Parameters
[in]fdosmocom file descriptor to be checked
Returns
true if registered; otherwise false

References osmo_fd::fd, list, llist_for_each_entry, and osmo_fds.

Referenced by osmo_fd_close(), and osmo_fd_register().

◆ osmo_fd_read_disable()

static void osmo_fd_read_disable ( struct osmo_fd ofd)
inlinestatic

◆ osmo_fd_read_enable()

static void osmo_fd_read_enable ( struct osmo_fd ofd)
inlinestatic

◆ osmo_fd_register()

int osmo_fd_register ( struct osmo_fd fd)

Register a new file descriptor with select loop abstraction.

Parameters
[in]fdosmocom file descriptor to be registered
Returns
0 on success; negative in case of error

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(), osmo_fd_init_ofd(), osmo_mnl_init(), osmo_signalfd_setup(), and osmo_timerfd_setup().

◆ osmo_fd_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.

Parameters
[in,out]ofdOsmo FD to be set-up
[in]fdOS-level file descriptor number
[in]whenbit-mask of OSMO_FD_{READ,WRITE,EXECEPT}
[in]cbCall-back function to be called
[in]dataPrivate context pointer
[in]priv_nrPrivate 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().

◆ osmo_fd_unregister()

void osmo_fd_unregister ( struct osmo_fd fd)

Unregister a file descriptor from select loop abstraction.

Parameters
[in]fdosmocom file descriptor to be unregistered

References g_poll, osmo_fd::list, llist_del(), poll_state::num_registered, and unregistered_count.

Referenced by osmo_fd_close(), osmo_mnl_destroy(), osmo_timerfd_setup(), and signalfd_callback().

◆ osmo_fd_update_when()

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().

◆ osmo_fd_write_disable()

static void osmo_fd_write_disable ( struct osmo_fd ofd)
inlinestatic

◆ osmo_fd_write_enable()

static void osmo_fd_write_enable ( struct osmo_fd ofd)
inlinestatic

◆ osmo_select_init()

void osmo_select_init ( void  )

initialize the osmocom select abstraction for the current thread

References INIT_LLIST_HEAD, and osmo_fds.

Referenced by __attribute__().

◆ osmo_select_main()

int osmo_select_main ( int  polling)

select main loop integration

Parameters
[in]pollingshould we pollonly (1) or block on select (0)
Returns
0 if no fd handled; 1 if fd handled; negative in case of error

References _osmo_select_main(), osmo_ctx, osmo_panic(), and osmo_talloc_contexts::select.

◆ osmo_select_main_ctx()

int osmo_select_main_ctx ( int  polling)

select main loop integration with temporary select-dispatch talloc context

Parameters
[in]pollingshould we pollonly (1) or block on select (0)
Returns
0 if no fd handled; 1 if fd handled; negative in case of error

References _osmo_select_main(), osmo_ctx, and osmo_talloc_contexts::select.

◆ osmo_signalfd_setup()

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.

Parameters
[in]ctxtalloc context from which osmo_signalfd is to be allocated
[in]setof signals to be accept via this file descriptor
[in]cbcall-back function to be called for each arriving signal
[in]dataopaque user-provided data to pass to callback
Returns
pointer to newly-allocated + registered osmo_signalfd; NULL on error

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.

◆ osmo_timerfd_disable()

int osmo_timerfd_disable ( struct osmo_fd ofd)

disable the osmocom-wrapped timerfd

References osmo_fd::fd.

Referenced by start_timer().

◆ osmo_timerfd_schedule()

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

Parameters
[in]ofdOsmocom wrapped timerfd
[in]firstRelative time at which the timer should first execute (NULL = interval)
[in]intervalTime interval at which subsequent timer shall fire
Returns
0 on success; negative on error

References osmo_fd::fd.

Referenced by start_timer().

◆ osmo_timerfd_setup()

int osmo_timerfd_setup ( struct osmo_fd ofd,
int(*)(struct osmo_fd *, unsigned int)  cb,
void *  data 
)

setup osmocom-wrapped timerfd

Parameters
[in,out]ofdOsmocom-wrapped timerfd on which to operate
[in]cbCall-back function called when timerfd becomes readable
[in]dataOpaque data to be passed on to call-back
Returns
0 on success; negative on error

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 start_timer().

◆ poll_disp_fds()

static int poll_disp_fds ( int  n_fd)
static

◆ poll_fill_fds()

static unsigned int poll_fill_fds ( void  )
static

◆ signalfd_callback()

static int signalfd_callback ( struct osmo_fd ofd,
unsigned int  what 
)
static

Variable Documentation

◆ g_poll

◆ maxfd

__thread int maxfd = 0
static

Referenced by osmo_fd_register().

◆ osmo_fds

◆ unregistered_count

__thread int unregistered_count
static