aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2009-07-28 13:32:00 +0200
committerHarald Welte <laforge@gnumonks.org>2009-07-28 18:27:52 +0200
commit709f2fd8c0bba0dafd9e2c8c3d2e469852a6ddd4 (patch)
treed9e3f9d78537984eba96a4d3d4d4f555035f2990 /openbsc
parent7bfc26749662e3a3227037cce4a24748343b50be (diff)
enable select.c handler to support removal of two consecutive fd's
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/src/select.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/openbsc/src/select.c b/openbsc/src/select.c
index 11b7e6b49..7f45426d0 100644
--- a/openbsc/src/select.c
+++ b/openbsc/src/select.c
@@ -25,6 +25,7 @@
static int maxfd = 0;
static LLIST_HEAD(bsc_fds);
+static int unregistered_count;
int bsc_register_fd(struct bsc_fd *fd)
{
@@ -50,6 +51,7 @@ int bsc_register_fd(struct bsc_fd *fd)
void bsc_unregister_fd(struct bsc_fd *fd)
{
+ unregistered_count++;
llist_del(&fd->list);
}
@@ -86,6 +88,8 @@ int bsc_select_main(int polling)
bsc_update_timers();
/* call registered callback functions */
+restart:
+ unregistered_count = 0;
llist_for_each_entry_safe(ufd, tmp, &bsc_fds, list) {
int flags = 0;
@@ -102,6 +106,11 @@ int bsc_select_main(int polling)
work = 1;
ufd->cb(ufd, flags);
}
+ /* ugly, ugly hack. If more than one filedescriptors were
+ * unregistered, they might have been consecutive and
+ * llist_for_each_entry_safe() is no longer safe */
+ if (unregistered_count > 1)
+ goto restart;
}
return work;
}