From 37428306a270088bfcb1f94362a0fe5b7a5a888e Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Wed, 10 Apr 2013 12:19:13 +1000 Subject: waiter: Don't rely on global variables to keep waiter state Rather than defining the set of waiters (and pollfds) in waiter.c, add a struct waitset to contain these. A waitset is created with waitset_create, which is passed to the waiter_* functions. Signed-off-by: Jeremy Kerr Signed-off-by: Geoff Levand --- discover/discover-server.c | 8 +++-- discover/discover-server.h | 4 ++- discover/pb-discover.c | 12 ++++--- discover/udev.c | 4 +-- discover/udev.h | 3 +- discover/user-event.c | 5 +-- discover/user-event.h | 4 ++- lib/waiter/waiter.c | 83 ++++++++++++++++++++++++++++------------------ lib/waiter/waiter.h | 8 +++-- ui/ncurses/nc-cui.c | 14 ++++---- ui/ncurses/nc-cui.h | 1 + ui/twin/main-generic.c | 2 +- ui/twin/pbt-client.c | 14 +++++--- ui/twin/pbt-client.h | 1 + ui/twin/pbt-scr.c | 6 ++-- ui/twin/pbt-scr.h | 7 ++-- 16 files changed, 112 insertions(+), 64 deletions(-) diff --git a/discover/discover-server.c b/discover/discover-server.c index f4e96c0..21e15da 100644 --- a/discover/discover-server.c +++ b/discover/discover-server.c @@ -22,6 +22,7 @@ struct discover_server { int socket; + struct waitset *waitset; struct waiter *waiter; struct list clients; struct device_handler *device_handler; @@ -184,7 +185,7 @@ void discover_server_set_device_source(struct discover_server *server, server->device_handler = handler; } -struct discover_server *discover_server_init(void) +struct discover_server *discover_server_init(struct waitset *waitset) { struct discover_server *server; struct sockaddr_un addr; @@ -194,6 +195,7 @@ struct discover_server *discover_server_init(void) return NULL; server->waiter = NULL; + server->waitset = waitset; list_init(&server->clients); unlink(PB_SOCKET_PATH); @@ -219,8 +221,8 @@ struct discover_server *discover_server_init(void) goto out_err; } - server->waiter = waiter_register(server->socket, WAIT_IN, - discover_server_process, server); + server->waiter = waiter_register(server->waitset, server->socket, + WAIT_IN, discover_server_process, server); return server; diff --git a/discover/discover-server.h b/discover/discover-server.h index 7c89938..6650bba 100644 --- a/discover/discover-server.h +++ b/discover/discover-server.h @@ -1,11 +1,13 @@ #ifndef _DISCOVER_SERVER_H #define _DISCOVER_SERVER_H +#include + struct discover_server; struct device_handler; struct device; -struct discover_server *discover_server_init(void); +struct discover_server *discover_server_init(struct waitset *waitset); void discover_server_destroy(struct discover_server *server); diff --git a/discover/pb-discover.c b/discover/pb-discover.c index aac50df..536f6e6 100644 --- a/discover/pb-discover.c +++ b/discover/pb-discover.c @@ -101,6 +101,7 @@ int main(int argc, char *argv[]) { struct device_handler *handler; struct discover_server *server; + struct waitset *waitset; struct opts opts; struct udev *udev; struct user_event *uev; @@ -138,7 +139,9 @@ int main(int argc, char *argv[]) signal(SIGINT, sigint_handler); - server = discover_server_init(); + waitset = waitset_create(NULL); + + server = discover_server_init(waitset); if (!server) return EXIT_FAILURE; @@ -148,11 +151,11 @@ int main(int argc, char *argv[]) discover_server_set_device_source(server, handler); - udev = udev_init(handler); + udev = udev_init(waitset, handler); if (!udev) return EXIT_FAILURE; - uev = user_event_init(handler); + uev = user_event_init(waitset, handler); if (!uev) return EXIT_FAILURE; @@ -160,11 +163,12 @@ int main(int argc, char *argv[]) user_event_trigger(uev); for (running = 1; running;) { - if (waiter_poll()) + if (waiter_poll(waitset)) break; } device_handler_destroy(handler); + waitset_destroy(waitset); pb_log("--- end ---\n"); diff --git a/discover/udev.c b/discover/udev.c index 28357c7..40b9f63 100644 --- a/discover/udev.c +++ b/discover/udev.c @@ -116,7 +116,7 @@ static int udev_destructor(void *p) return 0; } -struct udev *udev_init(struct device_handler *handler) +struct udev *udev_init(struct waitset *waitset, struct device_handler *handler) { struct sockaddr_un addr; struct udev *udev; @@ -144,7 +144,7 @@ struct udev *udev_init(struct device_handler *handler) goto out_err; } - waiter_register(udev->socket, WAIT_IN, udev_process, udev); + waiter_register(waitset, udev->socket, WAIT_IN, udev_process, udev); pb_log("%s: waiting on %s\n", __func__, PBOOT_DEVICE_SOCKET); diff --git a/discover/udev.h b/discover/udev.h index db17c45..590eed1 100644 --- a/discover/udev.h +++ b/discover/udev.h @@ -3,8 +3,9 @@ struct udev; struct device_handler; +struct waitset; -struct udev *udev_init(struct device_handler *handler); +struct udev *udev_init(struct waitset *waitset, struct device_handler *handler); int udev_trigger(struct udev *udev); void udev_destroy(struct udev *udev); diff --git a/discover/user-event.c b/discover/user-event.c index afc4c43..db12bd1 100644 --- a/discover/user-event.c +++ b/discover/user-event.c @@ -118,7 +118,8 @@ static int user_event_destructor(void *arg) return 0; } -struct user_event *user_event_init(struct device_handler *handler) +struct user_event *user_event_init(struct waitset *waitset, + struct device_handler *handler) { struct sockaddr_un addr; struct user_event *uev; @@ -147,7 +148,7 @@ struct user_event *user_event_init(struct device_handler *handler) strerror(errno)); } - waiter_register(uev->socket, WAIT_IN, user_event_process, uev); + waiter_register(waitset, uev->socket, WAIT_IN, user_event_process, uev); pb_log("%s: waiting on %s\n", __func__, PBOOT_USER_EVENT_SOCKET); diff --git a/discover/user-event.h b/discover/user-event.h index e134d0c..383bdd0 100644 --- a/discover/user-event.h +++ b/discover/user-event.h @@ -25,8 +25,10 @@ #define PBOOT_USER_EVENT_SIZE (1 * 1024) struct user_event; +struct waitset; -struct user_event *user_event_init(struct device_handler *handler); +struct user_event *user_event_init(struct waitset *waitset, + struct device_handler *handler); void user_event_trigger(struct user_event *uev); void user_event_destroy(struct user_event *uev); diff --git a/lib/waiter/waiter.c b/lib/waiter/waiter.c index 0bb213c..ac28436 100644 --- a/lib/waiter/waiter.c +++ b/lib/waiter/waiter.c @@ -8,29 +8,48 @@ #include "waiter.h" struct waiter { + struct waitset *set; int fd; int events; waiter_cb callback; void *arg; }; -static struct waiter *waiters; -static int n_waiters; +struct waitset { + struct waiter *waiters; + int n_waiters; + struct pollfd *pollfds; + int n_pollfds; +}; -struct waiter *waiter_register(int fd, int events, +struct waitset *waitset_create(void *ctx) +{ + struct waitset *set = talloc_zero(ctx, struct waitset); + return set; +} + +void waitset_destroy(struct waitset *set) +{ + talloc_free(set); +} + +struct waiter *waiter_register(struct waitset *set, int fd, int events, waiter_cb callback, void *arg) { - struct waiter *waiter; + struct waiter *waiters, *waiter; - n_waiters++; + waiters = talloc_realloc(set, set->waiters, + struct waiter, set->n_waiters + 1); - waiters = talloc_realloc(NULL, waiters, struct waiter, n_waiters); - - if(!waiters) + if (!waiters) return NULL; - - waiter = &waiters[n_waiters - 1]; + set->n_waiters++; + set->waiters = waiters; + + waiter = &set->waiters[set->n_waiters - 1]; + + waiter->set = set; waiter->fd = fd; waiter->events = events; waiter->callback = callback; @@ -41,47 +60,47 @@ struct waiter *waiter_register(int fd, int events, void waiter_remove(struct waiter *waiter) { + struct waitset *set = waiter->set; int i; - i = waiter - waiters; - assert(i >= 0 && i < n_waiters); + i = waiter - set->waiters; + assert(i >= 0 && i < set->n_waiters); - n_waiters--; - memmove(&waiters[i], &waiters[i+1], - (n_waiters - i) * sizeof(waiters[0])); + set->n_waiters--; + memmove(&set->waiters[i], &set->waiters[i+1], + (set->n_waiters - i) * sizeof(set->waiters[0])); - waiters = talloc_realloc(NULL, waiters, struct waiter, n_waiters); + set->waiters = talloc_realloc(set->waiters, set->waiters, struct waiter, + set->n_waiters); } -int waiter_poll(void) +int waiter_poll(struct waitset *set) { - 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); - n_pollfds = n_waiters; + if (set->n_waiters != set->n_pollfds) { + set->pollfds = talloc_realloc(set, set->pollfds, + struct pollfd, set->n_waiters); + set->n_pollfds = set->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; + for (i = 0; i < set->n_waiters; i++) { + set->pollfds[i].fd = set->waiters[i].fd; + set->pollfds[i].events = set->waiters[i].events; + set->pollfds[i].revents = 0; } - rc = poll(pollfds, n_waiters, -1); + rc = poll(set->pollfds, set->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); + for (i = 0; i < set->n_waiters; i++) { + if (set->pollfds[i].revents) { + rc = set->waiters[i].callback(set->waiters[i].arg); if (rc) - waiter_remove(&waiters[i]); + waiter_remove(&set->waiters[i]); } } diff --git a/lib/waiter/waiter.h b/lib/waiter/waiter.h index ff8a5ff..ed7f6bb 100644 --- a/lib/waiter/waiter.h +++ b/lib/waiter/waiter.h @@ -4,6 +4,7 @@ #include struct waiter; +struct waitset; enum events { WAIT_IN = POLLIN, @@ -12,12 +13,15 @@ enum events { typedef int (*waiter_cb)(void *); -struct waiter *waiter_register(int fd, int events, +struct waitset *waitset_create(void *ctx); +void waitset_destroy(struct waitset *waitset); + +struct waiter *waiter_register(struct waitset *waitset, int fd, int events, waiter_cb callback, void *arg); void waiter_remove(struct waiter *waiter); -int waiter_poll(void); +int waiter_poll(struct waitset *waitset); #endif /* _WAITER_H */ diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c index b9d8d79..a909b82 100644 --- a/ui/ncurses/nc-cui.c +++ b/ui/ncurses/nc-cui.c @@ -553,6 +553,7 @@ struct cui *cui_init(void* platform_info, cui->on_kexec = on_kexec; cui->timer.handle_timeout = cui_handle_timeout; cui->dry_run = dry_run; + cui->waitset = waitset_create(cui); /* Loop here for scripts that just started the server. */ @@ -595,18 +596,19 @@ retry_start: atexit(nc_atexit); nc_start(); - waiter_register(discover_client_get_fd(client), WAIT_IN, - cui_client_process_socket, client); + waiter_register(cui->waitset, discover_client_get_fd(client), WAIT_IN, + cui_client_process_socket, client); - waiter_register(STDIN_FILENO, WAIT_IN, cui_process_key, cui); + waiter_register(cui->waitset, STDIN_FILENO, WAIT_IN, + cui_process_key, cui); if (js_map) { cui->pjs = pjs_init(cui, js_map); if (cui->pjs) - waiter_register(pjs_get_fd(cui->pjs), WAIT_IN, - cui_process_js, cui); + waiter_register(cui->waitset, pjs_get_fd(cui->pjs), + WAIT_IN, cui_process_js, cui); } return cui; @@ -638,7 +640,7 @@ int cui_run(struct cui *cui, struct pmenu *main, unsigned int default_item) cui->current->post(cui->current); while (1) { - int result = waiter_poll(); + int result = waiter_poll(cui->waitset); if (result < 0 && errno != EINTR) { pb_log("%s: poll: %s\n", __func__, strerror(errno)); diff --git a/ui/ncurses/nc-cui.h b/ui/ncurses/nc-cui.h index 90eef1c..ddbf27f 100644 --- a/ui/ncurses/nc-cui.h +++ b/ui/ncurses/nc-cui.h @@ -55,6 +55,7 @@ struct cui { struct nc_scr *current; struct pmenu *main; struct ui_timer timer; + struct waitset *waitset; struct pjs *pjs; void *platform_info; unsigned int default_item; diff --git a/ui/twin/main-generic.c b/ui/twin/main-generic.c index 91a525b..8ed46b7 100644 --- a/ui/twin/main-generic.c +++ b/ui/twin/main-generic.c @@ -215,7 +215,7 @@ static int kexec_cb(struct pbt_client *client, struct pb_opt_data *opt_data) static int run(struct pbt_client *client) { while (1) { - int result = waiter_poll(); + int result = waiter_poll(client->waitset); if (result < 0 && errno != EINTR) { pb_log("%s: poll: %s\n", __func__, strerror(errno)); diff --git a/ui/twin/pbt-client.c b/ui/twin/pbt-client.c index 6a4d863..8eba0a2 100644 --- a/ui/twin/pbt-client.c +++ b/ui/twin/pbt-client.c @@ -281,11 +281,14 @@ struct pbt_client *pbt_client_init(enum pbt_twin_backend backend, talloc_set_destructor(pbt_client, (void *)pbt_client_destructor); + pbt_client->waitset = waitset_create(pbt_client); + pbt_client->sig = "pbt_client"; pbt_client->kexec_cb = kexec_cb; pbt_client->dry_run = dry_run; - pbt_client->frame.scr = pbt_scr_init(pbt_client, backend, width, height, - NULL, NULL); + pbt_client->frame.scr = pbt_scr_init(pbt_client, pbt_client->waitset, + backend, width, height, NULL, NULL); + if (!pbt_client->frame.scr) goto fail_scr_init; @@ -329,9 +332,10 @@ retry_start: goto fail_client_init; } - waiter_register(discover_client_get_fd(pbt_client->discover_client), - WAIT_IN, (waiter_cb)discover_client_process, - pbt_client->discover_client); + waiter_register(pbt_client->waitset, + discover_client_get_fd(pbt_client->discover_client), + WAIT_IN, (waiter_cb)discover_client_process, + pbt_client->discover_client); return pbt_client; diff --git a/ui/twin/pbt-client.h b/ui/twin/pbt-client.h index 014d5b2..6c35920 100644 --- a/ui/twin/pbt-client.h +++ b/ui/twin/pbt-client.h @@ -49,6 +49,7 @@ struct pbt_client { struct pbt_frame frame; struct discover_client *discover_client; + struct waitset *waitset; }; struct pbt_client *pbt_client_init(enum pbt_twin_backend backend, diff --git a/ui/twin/pbt-scr.c b/ui/twin/pbt-scr.c index 3a5a70b..8532bc1 100644 --- a/ui/twin/pbt-scr.c +++ b/ui/twin/pbt-scr.c @@ -368,7 +368,9 @@ static void pbt_scr_destructor(struct pbt_scr *scr) memset(scr, 0, sizeof(*scr)); } -struct pbt_scr *pbt_scr_init(void *talloc_ctx, enum pbt_twin_backend backend, +struct pbt_scr *pbt_scr_init(void *talloc_ctx, + struct waitset *waitset, + enum pbt_twin_backend backend, unsigned int width, unsigned int height, const char *filename_background, twin_bool_t (*scr_event_cb)(twin_screen_t *tscreen, @@ -441,7 +443,7 @@ struct pbt_scr *pbt_scr_init(void *talloc_ctx, enum pbt_twin_backend backend, assert(waiter_fd != -1); - waiter_register(waiter_fd, WAIT_IN, (void *)pbt_twin_waiter_cb, + waiter_register(waitset, waiter_fd, WAIT_IN, (void *)pbt_twin_waiter_cb, &scr->twin_ctx); return scr; diff --git a/ui/twin/pbt-scr.h b/ui/twin/pbt-scr.h index c075aad..1198a59 100644 --- a/ui/twin/pbt-scr.h +++ b/ui/twin/pbt-scr.h @@ -18,6 +18,8 @@ #if !defined(_PBT_SCR_H) #define _PBT_SCR_H +#include + #include #include #include @@ -137,7 +139,8 @@ struct pbt_scr { twin_pixmap_t *cursor; }; -struct pbt_scr *pbt_scr_init(void *talloc_ctx, enum pbt_twin_backend backend, +struct pbt_scr *pbt_scr_init(void *talloc_ctx, struct waitset *waitset, + enum pbt_twin_backend backend, unsigned int width, unsigned int height, const char *filename_background, twin_bool_t (*scr_event_cb)(twin_screen_t *tscreen, @@ -171,4 +174,4 @@ void pbt_window_redraw(twin_window_t *twindow); _p->height) -#endif \ No newline at end of file +#endif -- cgit v1.2.1