1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef __API_FD_ARRAY__ |
3 | #define __API_FD_ARRAY__ |
4 | |
5 | #include <stdio.h> |
6 | |
7 | struct pollfd; |
8 | |
9 | /** |
10 | * struct fdarray: Array of file descriptors |
11 | * |
12 | * @priv: Per array entry priv area, users should access just its contents, |
13 | * not set it to anything, as it is kept in synch with @entries, being |
14 | * realloc'ed, * for instance, in fdarray__{grow,filter}. |
15 | * |
16 | * I.e. using 'fda->priv[N].idx = * value' where N < fda->nr is ok, |
17 | * but doing 'fda->priv = malloc(M)' is not allowed. |
18 | */ |
19 | struct fdarray { |
20 | int nr; |
21 | int nr_alloc; |
22 | int nr_autogrow; |
23 | struct pollfd *entries; |
24 | struct priv { |
25 | union { |
26 | int idx; |
27 | void *ptr; |
28 | }; |
29 | unsigned int flags; |
30 | } *priv; |
31 | }; |
32 | |
33 | enum fdarray_flags { |
34 | fdarray_flag__default = 0x00000000, |
35 | fdarray_flag__nonfilterable = 0x00000001, |
36 | fdarray_flag__non_perf_event = 0x00000002, |
37 | }; |
38 | |
39 | void fdarray__init(struct fdarray *fda, int nr_autogrow); |
40 | void fdarray__exit(struct fdarray *fda); |
41 | |
42 | struct fdarray *fdarray__new(int nr_alloc, int nr_autogrow); |
43 | void fdarray__delete(struct fdarray *fda); |
44 | |
45 | int fdarray__add(struct fdarray *fda, int fd, short revents, enum fdarray_flags flags); |
46 | int fdarray__dup_entry_from(struct fdarray *fda, int pos, struct fdarray *from); |
47 | int fdarray__poll(struct fdarray *fda, int timeout); |
48 | int fdarray__filter(struct fdarray *fda, short revents, |
49 | void (*entry_destructor)(struct fdarray *fda, int fd, void *arg), |
50 | void *arg); |
51 | int fdarray__grow(struct fdarray *fda, int ); |
52 | int fdarray__fprintf(struct fdarray *fda, FILE *fp); |
53 | |
54 | static inline int fdarray__available_entries(struct fdarray *fda) |
55 | { |
56 | return fda->nr_alloc - fda->nr; |
57 | } |
58 | |
59 | #endif /* __API_FD_ARRAY__ */ |
60 | |