diff options
author | Philipp Maier <pmaier@sysmocom.de> | 2016-12-09 14:07:18 +0100 |
---|---|---|
committer | Philipp Maier <pmaier@sysmocom.de> | 2017-02-07 13:39:00 +0100 |
commit | b288853ffa01fbce1f5831ae6d387520c8882aec (patch) | |
tree | a37468ea47c91bb98f8f56385f68e45e7ecc628b /src | |
parent | 7132011afa1741f8cc435250a6981a4f6919f396 (diff) |
select: add functionality to check socket state
osmo_fd_register() is used to register socket file descriptors,
after registering a socket, there is no way to test if the socket
is still registered or actually registered at all.
This commit adds a new function osmo_fd_register_check() that can
be used to check in advance, if the socket fd is registered,
before performing further operations.
Change-Id: I48ec7098d6bba586c81bf0d5c9088108e2c081c6
Diffstat (limited to 'src')
-rw-r--r-- | src/select.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/src/select.c b/src/select.c index da273680..ab0734ea 100644 --- a/src/select.c +++ b/src/select.c @@ -23,6 +23,7 @@ #include <fcntl.h> #include <stdio.h> #include <string.h> +#include <stdbool.h> #include <sys/select.h> #include <osmocom/core/select.h> @@ -45,6 +46,23 @@ static int maxfd = 0; static LLIST_HEAD(osmo_fds); static int unregistered_count; + +/*! \brief Check if a file descriptor is already registered + * \param[in] fd osmocom file descriptor to be checked + * \returns true if registered; otherwise false + */ +bool osmo_fd_is_registered(struct osmo_fd *fd) +{ + struct osmo_fd *entry; + llist_for_each_entry(entry, &osmo_fds, list) { + if (entry == fd) { + return true; + } + } + + return false; +} + /*! \brief Register a new file descriptor with select loop abstraction * \param[in] fd osmocom file descriptor to be registered * \returns 0 on success; negative in case of error @@ -76,12 +94,9 @@ int osmo_fd_register(struct osmo_fd *fd) maxfd = fd->fd; #ifdef BSC_FD_CHECK - struct osmo_fd *entry; - llist_for_each_entry(entry, &osmo_fds, list) { - if (entry == fd) { - fprintf(stderr, "Adding a osmo_fd that is already in the list.\n"); - return 0; - } + if (osmo_fd_is_registered(fd)) { + fprintf(stderr, "Adding a osmo_fd that is already in the list.\n"); + return 0; } #endif @@ -95,6 +110,9 @@ int osmo_fd_register(struct osmo_fd *fd) */ void osmo_fd_unregister(struct osmo_fd *fd) { + /* Note: when fd is inside the osmo_fds list (not registered before) + * this function will crash! If in doubt, check file descriptor with + * osmo_fd_is_registered() */ unregistered_count++; llist_del(&fd->list); } |