diff options
Diffstat (limited to 'tools/lib/api/fd/array.h')
-rw-r--r-- | tools/lib/api/fd/array.h | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/tools/lib/api/fd/array.h b/tools/lib/api/fd/array.h new file mode 100644 index 000000000000..45db01818f45 --- /dev/null +++ b/tools/lib/api/fd/array.h | |||
@@ -0,0 +1,46 @@ | |||
1 | #ifndef __API_FD_ARRAY__ | ||
2 | #define __API_FD_ARRAY__ | ||
3 | |||
4 | #include <stdio.h> | ||
5 | |||
6 | struct pollfd; | ||
7 | |||
8 | /** | ||
9 | * struct fdarray: Array of file descriptors | ||
10 | * | ||
11 | * @priv: Per array entry priv area, users should access just its contents, | ||
12 | * not set it to anything, as it is kept in synch with @entries, being | ||
13 | * realloc'ed, * for instance, in fdarray__{grow,filter}. | ||
14 | * | ||
15 | * I.e. using 'fda->priv[N].idx = * value' where N < fda->nr is ok, | ||
16 | * but doing 'fda->priv = malloc(M)' is not allowed. | ||
17 | */ | ||
18 | struct fdarray { | ||
19 | int nr; | ||
20 | int nr_alloc; | ||
21 | int nr_autogrow; | ||
22 | struct pollfd *entries; | ||
23 | union { | ||
24 | int idx; | ||
25 | } *priv; | ||
26 | }; | ||
27 | |||
28 | void fdarray__init(struct fdarray *fda, int nr_autogrow); | ||
29 | void fdarray__exit(struct fdarray *fda); | ||
30 | |||
31 | struct fdarray *fdarray__new(int nr_alloc, int nr_autogrow); | ||
32 | void fdarray__delete(struct fdarray *fda); | ||
33 | |||
34 | int fdarray__add(struct fdarray *fda, int fd, short revents); | ||
35 | int fdarray__poll(struct fdarray *fda, int timeout); | ||
36 | int fdarray__filter(struct fdarray *fda, short revents, | ||
37 | void (*entry_destructor)(struct fdarray *fda, int fd)); | ||
38 | int fdarray__grow(struct fdarray *fda, int extra); | ||
39 | int fdarray__fprintf(struct fdarray *fda, FILE *fp); | ||
40 | |||
41 | static inline int fdarray__available_entries(struct fdarray *fda) | ||
42 | { | ||
43 | return fda->nr_alloc - fda->nr; | ||
44 | } | ||
45 | |||
46 | #endif /* __API_FD_ARRAY__ */ | ||