#include <errno.h>
#include <limits.h>
#include <poll.h>
-#include <stdbool.h>
#include <signal.h>
#include <stdint.h>
#include <stdlib.h>
TAILQ_HEAD (event_head, eloop_event) events;
size_t nevents;
struct event_head free_events;
- bool events_need_setup;
struct timespec now;
TAILQ_HEAD (timeout_head, eloop_timeout) timeouts;
static void
eloop_event_setup_fds(struct eloop *eloop)
{
- struct eloop_event *e, *ne;
+ struct eloop_event *e;
struct pollfd *pfd;
pfd = eloop->fds;
- TAILQ_FOREACH_SAFE(e, &eloop->events, next, ne) {
- if (e->fd == -1) {
- TAILQ_REMOVE(&eloop->events, e, next);
- TAILQ_INSERT_TAIL(&eloop->free_events, e, next);
- continue;
- }
+ TAILQ_FOREACH(e, &eloop->events, next) {
#ifdef ELOOP_DEBUG
fprintf(stderr, "%s(%d) fd=%d, rcb=%p, wcb=%p\n",
__func__, getpid(), e->fd, e->read_cb, e->write_cb);
pfd->revents = 0;
pfd++;
}
- eloop->events_need_setup = false;
}
size_t
}
setup:
- e->pollfd = NULL;
- eloop->events_need_setup = true;
+ eloop_event_setup_fds(eloop);
return 0;
}
struct eloop_event *e;
assert(eloop != NULL);
- if (fd == -1) {
- errno = EINVAL;
- return -1;
- }
TAILQ_FOREACH(e, &eloop->events, next) {
if (e->fd == fd)
goto remove;
e->write_cb = NULL;
e->write_cb_arg = NULL;
- if (e->pollfd != NULL) {
- e->pollfd->events &= ~POLLOUT;
- e->pollfd->revents &= ~POLLOUT;
- }
- return 1;
+ goto done;
}
remove:
- e->fd = -1;
+ TAILQ_REMOVE(&eloop->events, e, next);
+ TAILQ_INSERT_TAIL(&eloop->free_events, e, next);
eloop->nevents--;
- eloop->events_need_setup = true;
+
+done:
+ eloop_event_setup_fds(eloop);
return 1;
}
} else
tsp = NULL;
- if (eloop->events_need_setup)
- eloop_event_setup_fds(eloop);
-
n = ppoll(eloop->fds, (nfds_t)eloop->nevents, tsp, signals);
if (n == -1) {
if (errno == EINTR)
continue;
TAILQ_FOREACH(e, &eloop->events, next) {
- /* Skip freshly added events */
- if (e->pollfd == NULL)
- continue;
- if (e->pollfd->revents)
- n--;
- if (e->fd != -1 && e->pollfd->revents & POLLOUT) {
- if (e->write_cb != NULL)
+ if (e->pollfd->revents & POLLOUT) {
+ if (e->write_cb != NULL) {
e->write_cb(e->write_cb_arg);
+ break;
+ }
}
- if (e->fd != -1 &&
- e->pollfd != NULL && e->pollfd->revents)
- {
- if (e->read_cb != NULL)
+ if (e->pollfd->revents) {
+ if (e->read_cb != NULL) {
e->read_cb(e->read_cb_arg);
+ break;
+ }
}
- if (n == 0)
- break;
}
}