diff options
author | Harald Welte <laforge@gnumonks.org> | 2019-04-06 13:46:40 +0200 |
---|---|---|
committer | Harald Welte <laforge@osmocom.org> | 2019-11-07 10:24:50 +0100 |
commit | 7a010b10f7148ce42cead66f9dd4b7901b448418 (patch) | |
tree | b0ca20094c41534d1bafa33fbc57df1d4f1bcaa4 /src | |
parent | ba5a9b922477ff939cdffc4dbb785a8c8e1e5657 (diff) |
select: Make file descriptor lists per-thread
In a multi-threaded environemnt, it's likely that each thread will have
its own, distinct set of file descriptors that it wants to watch.
Hence, let's make the osmo_fd_* functions configure not one global
list of file descriptors, but a thread-local list of file descriptors.
Change-Id: I5082ed3e500ad1a7516e1785bc57e008da2fac9a
Diffstat (limited to 'src')
-rw-r--r-- | src/select.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/select.c b/src/select.c index 394a59dd..b997122e 100644 --- a/src/select.c +++ b/src/select.c @@ -50,9 +50,11 @@ * * \file select.c */ -static int maxfd = 0; -static LLIST_HEAD(osmo_fds); -static int unregistered_count; +/* keep a set of file descriptors per-thread, so that each thread can have its own + * distinct set of file descriptors to interact with */ +static __thread int maxfd = 0; +static __thread struct llist_head osmo_fds; /* TLS cannot use LLIST_HEAD() */ +static __thread int unregistered_count; /*! Set up an osmo-fd. Will not register it. * \param[inout] ofd Osmo FD to be set-up @@ -307,6 +309,18 @@ struct osmo_fd *osmo_fd_get_by_fd(int fd) return NULL; } +/*! initialize the osmocom select abstraction for the current thread */ +void osmo_select_init(void) +{ + INIT_LLIST_HEAD(&osmo_fds); +} + +/* ensure main thread always has pre-initialized osmo_fds */ +static __attribute__((constructor)) void on_dso_load_select(void) +{ + osmo_select_init(); +} + #ifdef HAVE_SYS_TIMERFD_H #include <sys/timerfd.h> |