mirror of https://gerrit.osmocom.org/libosmocore
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
This commit is contained in:
parent
ba5a9b9224
commit
7a010b10f7
|
@ -52,6 +52,7 @@ void osmo_fd_unregister(struct osmo_fd *fd);
|
||||||
void osmo_fd_close(struct osmo_fd *fd);
|
void osmo_fd_close(struct osmo_fd *fd);
|
||||||
int osmo_select_main(int polling);
|
int osmo_select_main(int polling);
|
||||||
int osmo_select_main_ctx(int polling);
|
int osmo_select_main_ctx(int polling);
|
||||||
|
void osmo_select_init(void);
|
||||||
|
|
||||||
struct osmo_fd *osmo_fd_get_by_fd(int fd);
|
struct osmo_fd *osmo_fd_get_by_fd(int fd);
|
||||||
|
|
||||||
|
|
20
src/select.c
20
src/select.c
|
@ -50,9 +50,11 @@
|
||||||
*
|
*
|
||||||
* \file select.c */
|
* \file select.c */
|
||||||
|
|
||||||
static int maxfd = 0;
|
/* keep a set of file descriptors per-thread, so that each thread can have its own
|
||||||
static LLIST_HEAD(osmo_fds);
|
* distinct set of file descriptors to interact with */
|
||||||
static int unregistered_count;
|
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.
|
/*! Set up an osmo-fd. Will not register it.
|
||||||
* \param[inout] ofd Osmo FD to be set-up
|
* \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;
|
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
|
#ifdef HAVE_SYS_TIMERFD_H
|
||||||
#include <sys/timerfd.h>
|
#include <sys/timerfd.h>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue