Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.15.
  1/*
  2 * Copyright (C) 2014, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
  3 *
  4 * Released under the GPL v2. (and only v2, not any later version)
  5 */
  6#include "array.h"
  7#include <errno.h>
  8#include <fcntl.h>
  9#include <poll.h>
 10#include <stdlib.h>
 11#include <unistd.h>
 12
 13void fdarray__init(struct fdarray *fda, int nr_autogrow)
 14{
 15	fda->entries	 = NULL;
 16	fda->priv	 = NULL;
 17	fda->nr		 = fda->nr_alloc = 0;
 18	fda->nr_autogrow = nr_autogrow;
 19}
 20
 21int fdarray__grow(struct fdarray *fda, int nr)
 22{
 23	void *priv;
 24	int nr_alloc = fda->nr_alloc + nr;
 25	size_t psize = sizeof(fda->priv[0]) * nr_alloc;
 26	size_t size  = sizeof(struct pollfd) * nr_alloc;
 27	struct pollfd *entries = realloc(fda->entries, size);
 28
 29	if (entries == NULL)
 30		return -ENOMEM;
 31
 32	priv = realloc(fda->priv, psize);
 33	if (priv == NULL) {
 34		free(entries);
 35		return -ENOMEM;
 36	}
 37
 38	fda->nr_alloc = nr_alloc;
 39	fda->entries  = entries;
 40	fda->priv     = priv;
 41	return 0;
 42}
 43
 44struct fdarray *fdarray__new(int nr_alloc, int nr_autogrow)
 45{
 46	struct fdarray *fda = calloc(1, sizeof(*fda));
 47
 48	if (fda != NULL) {
 49		if (fdarray__grow(fda, nr_alloc)) {
 50			free(fda);
 51			fda = NULL;
 52		} else {
 53			fda->nr_autogrow = nr_autogrow;
 54		}
 55	}
 56
 57	return fda;
 58}
 59
 60void fdarray__exit(struct fdarray *fda)
 61{
 62	free(fda->entries);
 63	free(fda->priv);
 64	fdarray__init(fda, 0);
 65}
 66
 67void fdarray__delete(struct fdarray *fda)
 68{
 69	fdarray__exit(fda);
 70	free(fda);
 71}
 72
 73int fdarray__add(struct fdarray *fda, int fd, short revents)
 74{
 75	int pos = fda->nr;
 76
 77	if (fda->nr == fda->nr_alloc &&
 78	    fdarray__grow(fda, fda->nr_autogrow) < 0)
 79		return -ENOMEM;
 80
 81	fda->entries[fda->nr].fd     = fd;
 82	fda->entries[fda->nr].events = revents;
 83	fda->nr++;
 84	return pos;
 85}
 86
 87int fdarray__filter(struct fdarray *fda, short revents,
 88		    void (*entry_destructor)(struct fdarray *fda, int fd))
 89{
 90	int fd, nr = 0;
 91
 92	if (fda->nr == 0)
 93		return 0;
 94
 95	for (fd = 0; fd < fda->nr; ++fd) {
 96		if (fda->entries[fd].revents & revents) {
 97			if (entry_destructor)
 98				entry_destructor(fda, fd);
 99
100			continue;
101		}
102
103		if (fd != nr) {
104			fda->entries[nr] = fda->entries[fd];
105			fda->priv[nr]	 = fda->priv[fd];
106		}
107
108		++nr;
109	}
110
111	return fda->nr = nr;
112}
113
114int fdarray__poll(struct fdarray *fda, int timeout)
115{
116	return poll(fda->entries, fda->nr, timeout);
117}
118
119int fdarray__fprintf(struct fdarray *fda, FILE *fp)
120{
121	int fd, printed = fprintf(fp, "%d [ ", fda->nr);
122
123	for (fd = 0; fd < fda->nr; ++fd)
124		printed += fprintf(fp, "%s%d", fd ? ", " : "", fda->entries[fd].fd);
125
126	return printed + fprintf(fp, " ]");
127}