a->tv_sec = 0;
}
-static bool timespec_isset(const struct timespec *a) {
- return a->tv_sec;
-}
-
static int io_compare(const io_t *a, const io_t *b) {
return a->fd - b->fd;
}
void timeout_add(event_loop_t *loop, timeout_t *timeout, timeout_cb_t cb, void *data, struct timespec *tv) {
timeout->cb = cb;
timeout->data = data;
- timeout->node.data = timeout;
timeout_set(loop, timeout, tv);
}
void timeout_set(event_loop_t *loop, timeout_t *timeout, struct timespec *tv) {
assert(timeout->cb);
- if(timespec_isset(&timeout->tv)) {
+ if(timeout->node.data) {
splay_unlink_node(&loop->timeouts, &timeout->node);
+ } else {
+ timeout->node.data = timeout;
}
if(!loop->now.tv_sec) {
}
static void timeout_disable(event_loop_t *loop, timeout_t *timeout) {
- splay_unlink_node(&loop->timeouts, &timeout->node);
+ if(timeout->node.data) {
+ splay_unlink_node(&loop->timeouts, &timeout->node);
+ timeout->node.data = NULL;
+ }
+
timespec_clear(&timeout->tv);
}
return;
}
- if(timespec_isset(&timeout->tv)) {
+ if(timeout->node.data) {
timeout_disable(loop, timeout);
}
});
if(sig) {
- sig->set = false;
+ atomic_flag_clear(&sig->set);
sig->cb(loop, sig->data);
}
}
}
void signal_trigger(event_loop_t *loop, signal_t *sig) {
- if(sig->set) {
+ if(atomic_flag_test_and_set(&sig->set)) {
return;
}
uint8_t signum = sig->signum;
- sig->set = true;
write(loop->pipefd[1], &signum, 1);
return;
}
sig->cb = cb;
sig->data = data;
sig->signum = signum;
- sig->set = false;
sig->node.data = sig;
+ atomic_flag_clear(&sig->set);
+
if(loop->pipefd[0] == -1) {
pipe_init(loop);
}
}
// release mesh mutex during select
- pthread_mutex_unlock(mutex);
+ assert(pthread_mutex_unlock(mutex) == 0);
#ifdef HAVE_PSELECT
int n = pselect(fds, &readable, &writable, NULL, &ts, NULL);
int n = select(fds, &readable, &writable, NULL, (struct timeval *)&tv);
#endif
- pthread_mutex_lock(mutex);
+ assert(pthread_mutex_lock(mutex) == 0);
clock_gettime(EVENT_CLOCK, &loop->now);
return true;
}
-void event_flush_output(event_loop_t *loop) {
- for splay_each(io_t, io, &loop->ios)
- if(FD_ISSET(io->fd, &loop->writefds)) {
- io->cb(loop, io->data, IO_WRITE);
- }
-}
-
void event_loop_start(event_loop_t *loop) {
loop->running = true;
}
assert(!loop->signals.count);
for splay_each(io_t, io, &loop->ios) {
- splay_unlink_node(&loop->ios, node);
+ splay_unlink_node(&loop->ios, splay_node);
}
for splay_each(timeout_t, timeout, &loop->timeouts) {
- splay_unlink_node(&loop->timeouts, node);
+ splay_unlink_node(&loop->timeouts, splay_node);
}
for splay_each(signal_t, signal, &loop->signals) {
- splay_unlink_node(&loop->signals, node);
+ splay_unlink_node(&loop->signals, splay_node);
}
}