Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
1b85337d ACM |
2 | #ifndef __API_FD_ARRAY__ |
3 | #define __API_FD_ARRAY__ | |
4 | ||
5 | #include <stdio.h> | |
6 | ||
7 | struct pollfd; | |
8 | ||
2171a925 ACM |
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 | */ | |
1b85337d ACM |
19 | struct fdarray { |
20 | int nr; | |
21 | int nr_alloc; | |
22 | int nr_autogrow; | |
23 | struct pollfd *entries; | |
ab4c1f9f AB |
24 | struct priv { |
25 | union { | |
26 | int idx; | |
27 | void *ptr; | |
28 | }; | |
29 | unsigned int flags; | |
2171a925 | 30 | } *priv; |
1b85337d ACM |
31 | }; |
32 | ||
ab4c1f9f | 33 | enum fdarray_flags { |
6562c9ac AH |
34 | fdarray_flag__default = 0x00000000, |
35 | fdarray_flag__nonfilterable = 0x00000001, | |
36 | fdarray_flag__non_perf_event = 0x00000002, | |
ab4c1f9f AB |
37 | }; |
38 | ||
1b85337d ACM |
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 | ||
ab4c1f9f | 45 | int fdarray__add(struct fdarray *fda, int fd, short revents, enum fdarray_flags flags); |
d87c25e8 | 46 | int fdarray__dup_entry_from(struct fdarray *fda, int pos, struct fdarray *from); |
1b85337d | 47 | int fdarray__poll(struct fdarray *fda, int timeout); |
2171a925 | 48 | int fdarray__filter(struct fdarray *fda, short revents, |
258e4bfc WN |
49 | void (*entry_destructor)(struct fdarray *fda, int fd, void *arg), |
50 | void *arg); | |
1b85337d ACM |
51 | int fdarray__grow(struct fdarray *fda, int extra); |
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__ */ |