OSDN Git Service

axfer: add an explanation about IRQ-based scheduling model
[android-x86/external-alsa-utils.git] / axfer / waiter.h
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // waiter.h - a header for I/O event waiter.
4 //
5 // Copyright (c) 2018 Takashi Sakamoto <o-takashi@sakamocchi.jp>
6 //
7 // Licensed under the terms of the GNU General Public License, version 2.
8
9 #ifndef __ALSA_UTILS_AXFER_WAITER__H_
10 #define __ALSA_UTILS_AXFER_WAITER__H_
11
12 #include <poll.h>
13
14 enum waiter_type {
15         WAITER_TYPE_DEFAULT = 0,
16         WAITER_TYPE_POLL,
17         WAITER_TYPE_SELECT,
18         WAITER_TYPE_EPOLL,
19         WAITER_TYPE_COUNT,
20 };
21
22 struct waiter_ops;
23
24 struct waiter_context {
25         enum waiter_type type;
26         const struct waiter_ops *ops;
27         void *private_data;
28
29         struct pollfd *pfds;
30         unsigned int pfd_count;
31 };
32
33 enum waiter_type waiter_type_from_label(const char *label);
34 const char *waiter_label_from_type(enum waiter_type type);
35
36 int waiter_context_init(struct waiter_context *waiter,
37                         enum waiter_type type, unsigned int pfd_count);
38 int waiter_context_prepare(struct waiter_context *waiter);
39 int waiter_context_wait_event(struct waiter_context *waiter,
40                                 int timeout_msec);
41 void waiter_context_release(struct waiter_context *waiter);
42 void waiter_context_destroy(struct waiter_context *waiter);
43
44 // For internal use in 'waiter' module.
45
46 struct waiter_ops {
47         int (*prepare)(struct waiter_context *waiter);
48         int (*wait_event)(struct waiter_context *waiter, int timeout_msec);
49         void (*release)(struct waiter_context *waiter);
50 };
51
52 struct waiter_data {
53         struct waiter_ops ops;
54         unsigned int private_size;
55 };
56
57 extern const struct waiter_data waiter_poll;
58 extern const struct waiter_data waiter_select;
59 extern const struct waiter_data waiter_epoll;
60
61 #endif