Select loop abstraction

## Files

file | select.h
file | select.c

## Data Structures

struct | osmo_fd
| Structure representing a file dsecriptor. More...

## Macros

#define | BSC_FD_READ 0x0001
| Indicate interest in reading from the file descriptor. More...
#define | BSC_FD_WRITE 0x0002
| Indicate interest in writing to the file descriptor. More...
#define | BSC_FD_EXCEPT 0x0004
| Indicate interest in exceptions from the file descriptor. More...

## 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...
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...
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 osmcoom-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...
static | LLIST_HEAD (osmo_fds)

## Variables

static int | maxfd = 0
static int | unregistered_count

## Detailed Description

select() loop abstraction

## Macro Definition Documentation

## BSC_FD_EXCEPT

#define BSC_FD_EXCEPT 0x0004

Indicate interest in exceptions from the file descriptor.

## BSC_FD_READ

#define BSC_FD_READ 0x0001

Indicate interest in reading from the file descriptor.

## BSC_FD_WRITE

#define BSC_FD_WRITE 0x0002

Indicate interest in writing to the file descriptor.

## Function Documentation

## LLIST_HEAD()

static LLIST_HEAD | ( | osmo_fds |  | ) |

static

## 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] | 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(), and osmo_fd_unregister().

## osmo_fd_disp_fds()

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

inline

References BSC_FD_EXCEPT, BSC_FD_READ, BSC_FD_WRITE, osmo_fd::cb, osmo_fd::fd, osmo_fd::list, llist_for_each_entry_safe, and unregistered_count.

Referenced by osmo_select_main().

## 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] | _rset | The readfds to populate
  [in] | _wset | The wrtiefds to populate
  [in] | _eset | The errorfds to populate

Returns
  The highest file descriptor seen or 0 on an empty list

References BSC_FD_EXCEPT, BSC_FD_READ, BSC_FD_WRITE, osmo_fd::fd, osmo_fd::list, llist_for_each_entry, and osmo_fd::when.

Referenced by osmo_select_main().

## 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] | fd | file descriptor to use as search key

Returns
  osmo_fd for fd; NULL in case it doesn't exist

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

## osmo_fd_is_registered()

bool osmo_fd_is_registered | ( | struct osmo_fd * | fd | ) |

Check if a file descriptor is already registered.

Parameters

  [in] | fd | osmocom file descriptor to be checked

Returns
  true if registered; otherwise false

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

Referenced by osmo_fd_close(), and osmo_fd_register().

## osmo_fd_register()

int osmo_fd_register | ( | struct osmo_fd * | fd | ) |

Register a new file descriptor with select loop abstraction.

Parameters

  [in] | fd | osmocom file descriptor to be registered

Returns
  0 on success; negative in case of error

References osmo_fd::fd, llist_add_tail(), maxfd, and osmo_fd_is_registered().

Referenced by gsmtap_source_add_sink(), gsmtap_source_init(), osmo_fd_init_ofd(), 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] | ofd | Osmo FD to be set-up
  [in] | fd | OS-level file descriptor number
  [in] | when | bit-mask of BSC_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, osmo_fd::data, osmo_fd::fd, osmo_fd::priv_nr, and osmo_fd::when.

## osmo_fd_unregister()

void osmo_fd_unregister | ( | struct osmo_fd * | fd | ) |

Unregister a file descriptor from select loop abstraction.

Parameters

  [in] | fd | osmocom file descriptor to be unregistered

References osmo_fd::fd, llist_del(), and unregistered_count.

Referenced by osmo_fd_close().

## osmo_select_main()

int osmo_select_main | ( | int | polling | ) |

select main loop integration

Parameters

  [in] | polling | should we pollonly (1) or block on select (0)

Returns
  0 if no fd handled; 1 if fd handled; negative in case of error

References maxfd, osmo_fd_disp_fds(), osmo_fd_fill_fds(), osmo_timers_nearest(), osmo_timers_prepare(), and osmo_timers_update().

## osmo_timerfd_disable()

int osmo_timerfd_disable | ( | struct osmo_fd * | ofd | ) |

disable the osmocom-wrapped timerfd

References osmo_fd::fd.

## osmo_timerfd_schedule()

int osmo_timerfd_schedule | ( | struct osmo_fd * | ofd,
|  | const struct timespec * | first,
|  | const struct timespec * | interval
| ) |  |

schedule the osmcoom-wrapped timerfd to occur first at first, then periodically at interval

Parameters

  [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

Returns
  0 on success; negative on error

References osmo_fd::fd.

## 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] | 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

Returns
  0 on success; negative on error

We simply initialize the data structures here, but do not yet schedule the timer.

References BSC_FD_READ, osmo_fd::cb, osmo_fd::data, osmo_fd::fd, osmo_fd_register(), and osmo_fd::when.

## Variable Documentation

## maxfd

int maxfd = 0

static

Referenced by osmo_fd_register(), and osmo_select_main().

## unregistered_count

int unregistered_count

static

Referenced by osmo_fd_disp_fds(), and osmo_fd_unregister().