From 812761a1f8ff94e4913529840b905360ff843fc4 Mon Sep 17 00:00:00 2001 From: Geoff Levand Date: Wed, 21 Jan 2009 16:26:54 -0800 Subject: Move waiter to library Move the waiter routines into the petitboot library. The waiter routines are generic enough to be used for both server and client. Does not change the waiter source. jk: move to lib/waiter/ instead of lib/ Signed-off-by: Geoff Levand Signed-off-by: Jeremy Kerr --- configure.ac | 3 +- discover/discover-server.c | 2 +- discover/pb-discover.c | 3 +- discover/udev.c | 2 +- discover/waiter.c | 83 ---------------------------------------------- discover/waiter.h | 23 ------------- lib/waiter/waiter.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++ lib/waiter/waiter.h | 23 +++++++++++++ rules.mk | 7 ++-- 9 files changed, 116 insertions(+), 113 deletions(-) delete mode 100644 discover/waiter.c delete mode 100644 discover/waiter.h create mode 100644 lib/waiter/waiter.c create mode 100644 lib/waiter/waiter.h diff --git a/configure.ac b/configure.ac index 650d60b..f06ac80 100644 --- a/configure.ac +++ b/configure.ac @@ -31,6 +31,7 @@ AC_PROG_INSTALL PKG_CHECK_MODULES([twin], [libtwin]) -mkdir -p discover ui/test ui/common lib/talloc lib/pb-protocol lib/list +mkdir -p discover ui/test ui/common lib/talloc lib/pb-protocol lib/list \ + lib/waiter AC_OUTPUT diff --git a/discover/discover-server.c b/discover/discover-server.c index b2025cc..1fab303 100644 --- a/discover/discover-server.c +++ b/discover/discover-server.c @@ -11,12 +11,12 @@ #include #include +#include #include "pb-protocol/pb-protocol.h" #include "list/list.h" #include "log.h" -#include "waiter.h" #include "device-handler.h" #include "discover-server.h" diff --git a/discover/pb-discover.c b/discover/pb-discover.c index 56602d9..d11ab64 100644 --- a/discover/pb-discover.c +++ b/discover/pb-discover.c @@ -2,10 +2,11 @@ #include #include +#include + #include "udev.h" #include "discover-server.h" #include "device-handler.h" -#include "waiter.h" #include "log.h" static int running; diff --git a/discover/udev.c b/discover/udev.c index 6747e78..66d9544 100644 --- a/discover/udev.c +++ b/discover/udev.c @@ -10,10 +10,10 @@ #include #include +#include #include "udev.h" #include "log.h" -#include "waiter.h" #include "pb-discover.h" #include "device-handler.h" diff --git a/discover/waiter.c b/discover/waiter.c deleted file mode 100644 index 21dd4a5..0000000 --- a/discover/waiter.c +++ /dev/null @@ -1,83 +0,0 @@ - -#include -#include -#include - -#include - -#include "waiter.h" - -struct waiter { - int fd; - int events; - waiter_cb callback; - void *arg; -}; - -static struct waiter *waiters; -static int n_waiters; - -struct waiter *waiter_register(int fd, int events, - waiter_cb callback, void *arg) -{ - struct waiter *waiter; - - n_waiters++; - - waiters = talloc_realloc(NULL, waiters, struct waiter, n_waiters); - waiter = &waiters[n_waiters - 1]; - - waiter->fd = fd; - waiter->events = events; - waiter->callback = callback; - waiter->arg = arg; - - return 0; -} - -void waiter_remove(struct waiter *waiter) -{ - int i; - - i = waiter - waiters; - assert(i >= 0 && i < n_waiters); - - n_waiters--; - memmove(&waiters[i], &waiters[i+1], n_waiters - i); - - waiters = talloc_realloc(NULL, waiters, struct waiter, n_waiters); -} - -int waiter_poll(void) -{ - static struct pollfd *pollfds; - static int n_pollfds; - int i, rc; - - if (n_waiters > n_pollfds) { - pollfds = talloc_realloc(NULL, pollfds, - struct pollfd, n_waiters); - } - - for (i = 0; i < n_waiters; i++) { - pollfds[i].fd = waiters[i].fd; - pollfds[i].events = waiters[i].events; - pollfds[i].revents = 0; - } - - rc = poll(pollfds, n_waiters, -1); - - if (rc <= 0) - return rc; - - for (i = 0; i < n_waiters; i++) { - if (pollfds[i].revents) { - rc = waiters[i].callback(waiters[i].arg); - - if (rc) - waiter_remove(&waiters[i]); - } - } - - return 0; -} diff --git a/discover/waiter.h b/discover/waiter.h deleted file mode 100644 index ff8a5ff..0000000 --- a/discover/waiter.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _WAITER_H -#define _WAITER_H - -#include - -struct waiter; - -enum events { - WAIT_IN = POLLIN, - WAIT_OUT = POLLOUT, -}; - -typedef int (*waiter_cb)(void *); - -struct waiter *waiter_register(int fd, int events, - waiter_cb callback, void *arg); - -void waiter_remove(struct waiter *waiter); - -int waiter_poll(void); -#endif /* _WAITER_H */ - - diff --git a/lib/waiter/waiter.c b/lib/waiter/waiter.c new file mode 100644 index 0000000..21dd4a5 --- /dev/null +++ b/lib/waiter/waiter.c @@ -0,0 +1,83 @@ + +#include +#include +#include + +#include + +#include "waiter.h" + +struct waiter { + int fd; + int events; + waiter_cb callback; + void *arg; +}; + +static struct waiter *waiters; +static int n_waiters; + +struct waiter *waiter_register(int fd, int events, + waiter_cb callback, void *arg) +{ + struct waiter *waiter; + + n_waiters++; + + waiters = talloc_realloc(NULL, waiters, struct waiter, n_waiters); + waiter = &waiters[n_waiters - 1]; + + waiter->fd = fd; + waiter->events = events; + waiter->callback = callback; + waiter->arg = arg; + + return 0; +} + +void waiter_remove(struct waiter *waiter) +{ + int i; + + i = waiter - waiters; + assert(i >= 0 && i < n_waiters); + + n_waiters--; + memmove(&waiters[i], &waiters[i+1], n_waiters - i); + + waiters = talloc_realloc(NULL, waiters, struct waiter, n_waiters); +} + +int waiter_poll(void) +{ + static struct pollfd *pollfds; + static int n_pollfds; + int i, rc; + + if (n_waiters > n_pollfds) { + pollfds = talloc_realloc(NULL, pollfds, + struct pollfd, n_waiters); + } + + for (i = 0; i < n_waiters; i++) { + pollfds[i].fd = waiters[i].fd; + pollfds[i].events = waiters[i].events; + pollfds[i].revents = 0; + } + + rc = poll(pollfds, n_waiters, -1); + + if (rc <= 0) + return rc; + + for (i = 0; i < n_waiters; i++) { + if (pollfds[i].revents) { + rc = waiters[i].callback(waiters[i].arg); + + if (rc) + waiter_remove(&waiters[i]); + } + } + + return 0; +} diff --git a/lib/waiter/waiter.h b/lib/waiter/waiter.h new file mode 100644 index 0000000..ff8a5ff --- /dev/null +++ b/lib/waiter/waiter.h @@ -0,0 +1,23 @@ +#ifndef _WAITER_H +#define _WAITER_H + +#include + +struct waiter; + +enum events { + WAIT_IN = POLLIN, + WAIT_OUT = POLLOUT, +}; + +typedef int (*waiter_cb)(void *); + +struct waiter *waiter_register(int fd, int events, + waiter_cb callback, void *arg); + +void waiter_remove(struct waiter *waiter); + +int waiter_poll(void); +#endif /* _WAITER_H */ + + diff --git a/rules.mk b/rules.mk index af6223b..607a25e 100644 --- a/rules.mk +++ b/rules.mk @@ -16,6 +16,7 @@ artwork = background.jpg cdrom.png hdd.png usbpen.png tux.png cursor.gz talloc_objs = lib/talloc/talloc.o list_objs = lib/list/list.o +waiter_objs = lib/waiter/waiter.o server_objs = lib/pb-protocol/pb-protocol.o parser_objs = discover/parser.o discover/parser-utils.o \ $(foreach p, $(parsers), discover/$(p)-parser.o) @@ -46,9 +47,9 @@ ui/test/pb-test: $(pb_test_objs) # $(foreach p,$(parsers),discover/$(p)-parser.o) pb_discover_objs = discover/pb-discover.o discover/udev.o discover/log.o \ - discover/waiter.o discover/discover-server.o \ - discover/device-handler.o discover/paths.o \ - $(talloc_objs) $(server_objs) $(parser_objs) $(list_objs) + discover/discover-server.o discover/device-handler.o \ + discover/paths.o $(talloc_objs) $(server_objs) \ + $(parser_objs) $(list_objs) $(waiter_objs) discover/pb-discover: $(pb_discover_objs) $(LINK.o) -o $@ $^ -- cgit v1.2.1