summaryrefslogtreecommitdiffstats
path: root/openbsc/src
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 13:32:00 +0200
commit716fa9f0d25c7332761f70b0d64ea609cf047330 (patch)
tree08be96a95738ed31adc972b24d2cd8fea7e32807 /openbsc/src
parent5f2134f12a80315cb2d4f2bb7bed4bcddd9205ac (diff)
enable select.c handler to support removal of two consecutive fd's
Diffstat (limited to 'openbsc/src')
-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;
}