]> git.alsa-project.org Git - alsa-utils.git/commitdiff
axfer: add an implementation of waiter for poll(2)
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Tue, 13 Nov 2018 06:41:42 +0000 (15:41 +0900)
committerTakashi Iwai <tiwai@suse.de>
Tue, 13 Nov 2018 11:04:50 +0000 (12:04 +0100)
This commit adds support of waiter for poll(2) system call.

Below lines are examples to use this option:
$ axfer transfer --waiter-type=poll -M -P -d 2 -D hw:0,3 /dev/urandom -f dat -vvv
$ axfer transfer --waiter-type=poll -M -C -d 2 -D hw:1,0 /dev/null -r 48000 -vvv

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
axfer/Makefile.am
axfer/waiter-poll.c [new file with mode: 0644]
axfer/waiter.c
axfer/waiter.h

index e425a28fd24feb1a3afa9b1d1e68c2802d978ffe..71230062c51f889877e1451849297146ccc6ea81 100644 (file)
@@ -50,4 +50,5 @@ axfer_SOURCES = \
        subcmd-transfer.c \
        xfer-libasound-irq-mmap.c \
        waiter.h \
-       waiter.c
+       waiter.c \
+       waiter-poll.c
diff --git a/axfer/waiter-poll.c b/axfer/waiter-poll.c
new file mode 100644 (file)
index 0000000..61aa1a0
--- /dev/null
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// waiter-poll.c - Waiter for event notification by poll(2).
+//
+// Copyright (c) 2018 Takashi Sakamoto <o-takashi@sakamocchi.jp>
+//
+// Licensed under the terms of the GNU General Public License, version 2.
+
+#include "waiter.h"
+#include "misc.h"
+
+#include <stdlib.h>
+#include <errno.h>
+#include <poll.h>
+
+static int poll_prepare(struct waiter_context *waiter)
+{
+       // Nothing to do because an instance of waiter has required data.
+       return 0;
+}
+
+static int poll_wait_event(struct waiter_context *waiter, int timeout_msec)
+{
+       int err;
+
+       err = poll(waiter->pfds, waiter->pfd_count, timeout_msec);
+       if (err < 0)
+               return -errno;
+
+       return err;
+}
+
+static void poll_release(struct waiter_context *waiter)
+{
+       // Nothing to do because an instance of waiter has required data.
+       return;
+}
+
+const struct waiter_data waiter_poll = {
+       .ops = {
+               .prepare        = poll_prepare,
+               .wait_event     = poll_wait_event,
+               .release        = poll_release,
+       },
+};
index 0bc4740a623a70a8235650d4efd4e73a218a0589..446e617bb2d98c41c38db247befd6d60aa93cd19 100644 (file)
@@ -16,6 +16,7 @@
 
 static const char *const waiter_type_labels[] = {
        [WAITER_TYPE_DEFAULT] = "default",
+       [WAITER_TYPE_POLL] = "poll",
 };
 
 enum waiter_type waiter_type_from_label(const char *label)
@@ -42,7 +43,7 @@ int waiter_context_init(struct waiter_context *waiter,
                enum waiter_type type;
                const struct waiter_data *waiter;
        } entries[] = {
-               {WAITER_TYPE_COUNT,     NULL},
+               {WAITER_TYPE_POLL,      &waiter_poll},
        };
        int i;
 
index 17e01cbf37d45cfcd4f5efd714ead743bbcf3c69..936672473b88d1dacd468e62d909aadb27f96cb5 100644 (file)
@@ -13,6 +13,7 @@
 
 enum waiter_type {
        WAITER_TYPE_DEFAULT = 0,
+       WAITER_TYPE_POLL,
        WAITER_TYPE_COUNT,
 };
 
@@ -51,4 +52,6 @@ struct waiter_data {
        unsigned int private_size;
 };
 
+extern const struct waiter_data waiter_poll;
+
 #endif