mirror of https://gerrit.osmocom.org/libosmocore
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
This commit is contained in:
parent
7132011afa
commit
b288853ffa
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <osmocom/core/linuxlist.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/*! \defgroup select Select loop abstraction
|
||||
* @{
|
||||
|
@ -35,6 +36,7 @@ struct osmo_fd {
|
|||
unsigned int priv_nr;
|
||||
};
|
||||
|
||||
bool osmo_fd_is_registered(struct osmo_fd *fd);
|
||||
int osmo_fd_register(struct osmo_fd *fd);
|
||||
void osmo_fd_unregister(struct osmo_fd *fd);
|
||||
int osmo_select_main(int polling);
|
||||
|
|
26
src/select.c
26
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,13 +94,10 @@ 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) {
|
||||
if (osmo_fd_is_registered(fd)) {
|
||||
fprintf(stderr, "Adding a osmo_fd that is already in the list.\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
llist_add_tail(&fd->list, &osmo_fds);
|
||||
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue