| 1 |
|
| 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 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
|