This commit adds support for poll(2) system call. --- aplay/Makefile.am | 3 ++- aplay/waiter-poll.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ aplay/waiter.c | 2 +- aplay/waiter.h | 3 +++ 4 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 aplay/waiter-poll.c diff --git a/aplay/Makefile.am b/aplay/Makefile.am index 634124b..a4a353e 100644 --- a/aplay/Makefile.am +++ b/aplay/Makefile.am @@ -24,7 +24,8 @@ aplay_SOURCES = \ aligner-single.c \ aligner-multiple.c \ waiter.h \ - waiter.c + waiter.c \ + waiter-poll.c EXTRA_DIST = aplay.1 arecord.1 EXTRA_CLEAN = arecord diff --git a/aplay/waiter-poll.c b/aplay/waiter-poll.c new file mode 100644 index 0000000..68ef4ae --- /dev/null +++ b/aplay/waiter-poll.c @@ -0,0 +1,66 @@ +/* + * waiter-waiter-poll.c - Waiter for event notification by poll(2). + * + * Copyright (c) 2017 Takashi Sakamoto <o-takashi@xxxxxxxxxxxxx> + * + * Licensed under the terms of the GNU General Public License, version 2. + */ + +#include "waiter.h" + +#include <poll.h> + +struct poll_state { + struct pollfd *pfds; + unsigned int count; +}; + +static int poll_prepare(struct waiter_context *waiter, int *fds, + unsigned int fd_count) +{ + struct poll_state *state = waiter->private_data; + int i; + + state->pfds = calloc(fd_count, sizeof(struct pollfd)); + if (state->pfds == NULL) + return -ENOMEM; + + for (i = 0; i < fd_count; ++i) { + state->pfds[i].fd = fds[i]; + state->pfds[i].events = POLLIN | POLLOUT; + } + + state->count = fd_count; + + return 0; +} + +static int poll_wait_event(struct waiter_context *waiter) +{ + struct poll_state *state = waiter->private_data; + int err; + + + err = poll(state->pfds, state->count, -1); + if (err < 0) + return -errno; + + return 0; +} + +static void poll_release(struct waiter_context *waiter) +{ + struct poll_state *state = waiter->private_data; + + free(state->pfds); + state->pfds = 0; +} + +const struct waiter_data waiter_poll = { + .ops = { + .prepare = poll_prepare, + .wait_event = poll_wait_event, + .release = poll_release, + }, + .private_size = sizeof(struct poll_state), +}; diff --git a/aplay/waiter.c b/aplay/waiter.c index d29a533..c238bf1 100644 --- a/aplay/waiter.c +++ b/aplay/waiter.c @@ -14,7 +14,7 @@ int waiter_context_init(struct waiter_context *waiter, enum waiter_type type) enum waiter_type type; const struct waiter_data *waiter; } entries[] = { - {WAITER_TYPE_COUNT, NULL}, + {WAITER_TYPE_POLL, &waiter_poll}, }; int i; diff --git a/aplay/waiter.h b/aplay/waiter.h index c63274a..5059a00 100644 --- a/aplay/waiter.h +++ b/aplay/waiter.h @@ -19,6 +19,7 @@ #endif enum waiter_type { + WAITER_TYPE_POLL = 0, WAITER_TYPE_COUNT, }; @@ -51,4 +52,6 @@ struct waiter_data { unsigned int private_size; }; +extern const struct waiter_data waiter_poll; + #endif -- 2.11.0 _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel