From 709f2fd8c0bba0dafd9e2c8c3d2e469852a6ddd4 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Tue, 28 Jul 2009 13:32:00 +0200 Subject: enable select.c handler to support removal of two consecutive fd's --- openbsc/src/select.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'openbsc/src/select.c') 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; } -- cgit v1.2.3