1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2014, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
12 void fdarray__init(struct fdarray
*fda
, int nr_autogrow
)
16 fda
->nr
= fda
->nr_alloc
= 0;
17 fda
->nr_autogrow
= nr_autogrow
;
20 int fdarray__grow(struct fdarray
*fda
, int nr
)
23 int nr_alloc
= fda
->nr_alloc
+ nr
;
24 size_t psize
= sizeof(fda
->priv
[0]) * nr_alloc
;
25 size_t size
= sizeof(struct pollfd
) * nr_alloc
;
26 struct pollfd
*entries
= realloc(fda
->entries
, size
);
31 priv
= realloc(fda
->priv
, psize
);
37 fda
->nr_alloc
= nr_alloc
;
38 fda
->entries
= entries
;
43 struct fdarray
*fdarray__new(int nr_alloc
, int nr_autogrow
)
45 struct fdarray
*fda
= calloc(1, sizeof(*fda
));
48 if (fdarray__grow(fda
, nr_alloc
)) {
52 fda
->nr_autogrow
= nr_autogrow
;
59 void fdarray__exit(struct fdarray
*fda
)
63 fdarray__init(fda
, 0);
66 void fdarray__delete(struct fdarray
*fda
)
72 int fdarray__add(struct fdarray
*fda
, int fd
, short revents
)
76 if (fda
->nr
== fda
->nr_alloc
&&
77 fdarray__grow(fda
, fda
->nr_autogrow
) < 0)
80 fda
->entries
[fda
->nr
].fd
= fd
;
81 fda
->entries
[fda
->nr
].events
= revents
;
86 int fdarray__filter(struct fdarray
*fda
, short revents
,
87 void (*entry_destructor
)(struct fdarray
*fda
, int fd
, void *arg
),
95 for (fd
= 0; fd
< fda
->nr
; ++fd
) {
96 if (fda
->entries
[fd
].revents
& revents
) {
98 entry_destructor(fda
, fd
, arg
);
104 fda
->entries
[nr
] = fda
->entries
[fd
];
105 fda
->priv
[nr
] = fda
->priv
[fd
];
114 int fdarray__poll(struct fdarray
*fda
, int timeout
)
116 return poll(fda
->entries
, fda
->nr
, timeout
);
119 int fdarray__fprintf(struct fdarray
*fda
, FILE *fp
)
121 int fd
, printed
= fprintf(fp
, "%d [ ", fda
->nr
);
123 for (fd
= 0; fd
< fda
->nr
; ++fd
)
124 printed
+= fprintf(fp
, "%s%d", fd
? ", " : "", fda
->entries
[fd
].fd
);
126 return printed
+ fprintf(fp
, " ]");