continue work on eventloop
parent
643cc75f67
commit
bcf3f8fe18
@ -1,34 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#if defined(__linux__)
|
|
||||||
#define PLATFORM_LINUX
|
|
||||||
#define EVENTLOOP_EPOLL
|
|
||||||
|
|
||||||
#elif defined(__APPLE__) && defined(__MACH__)
|
|
||||||
#define PLATFORM_OSX
|
|
||||||
#define EVENTLOOP_KQUEUE
|
|
||||||
|
|
||||||
#elif defined(__FreeBSD__)
|
|
||||||
#define PLATFORM_BSD
|
|
||||||
#define PLATFORM_FREEBSD
|
|
||||||
#define EVENTLOOP_KQUEUE
|
|
||||||
|
|
||||||
#elif defined(__NetBSD__)
|
|
||||||
#define PLATFORM_BSD
|
|
||||||
#define PLATFORM_NETBSD
|
|
||||||
#define EVENTLOOP_KQUEUE
|
|
||||||
|
|
||||||
#elif defined(__OpenBSD__)
|
|
||||||
#define PLATFORM_BSD
|
|
||||||
#define PLATFORM_OPENBSD
|
|
||||||
#define EVENTLOOP_KQUEUE
|
|
||||||
|
|
||||||
#elif defined(__DragonFly__)
|
|
||||||
#define PLATFORM_BSD
|
|
||||||
#define PLATFORM_DRAGONFLY
|
|
||||||
#define EVENTLOOP_KQUEUE
|
|
||||||
|
|
||||||
#else
|
|
||||||
#error "Failed to detect supported platform"
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@ -0,0 +1,79 @@
|
|||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/epoll.h>
|
||||||
|
|
||||||
|
#include "eventloop.h"
|
||||||
|
#include "eventloop_platform.h"
|
||||||
|
|
||||||
|
int owd_platform_el_init(struct owd_eventloop *el) {
|
||||||
|
if ((el->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)
|
||||||
|
return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void owd_platform_el_cleanup(struct owd_eventloop *el) {
|
||||||
|
close(el->epoll_fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void owd_platform_el_event_remove(struct owd_eventloop *el, struct owd_event *e) {
|
||||||
|
epoll_ctl(el->epoll_fd, EPOLL_CTL_DEL, e->epoll_registered_fd, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void owd_platform_el_event_cleanup(struct owd_eventloop *el, struct owd_event *e) {
|
||||||
|
if (e->epoll_fd_owned && (e->epoll_registered_fd >= 0)) {
|
||||||
|
close(e->epoll_registered_fd);
|
||||||
|
e->epoll_registered_fd = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int clear_timerfd(int fd) {
|
||||||
|
uint64_t tfd_buf;
|
||||||
|
ssize_t res;
|
||||||
|
|
||||||
|
do {
|
||||||
|
res = read(fd, &tfd_buf, sizeof(tfd_buf));
|
||||||
|
} while ((res < 0) && (errno == EINTR));
|
||||||
|
|
||||||
|
if (res < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int owd_platform_el_event_clear(struct owd_eventloop *el, struct owd_event *e) {
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if ((e->id.source == OWD_EVENT_SOURCE_TIMER) && (e->epoll_registered_fd >= 0)) {
|
||||||
|
if ((res = clear_timerfd(e->epoll_registered_fd)))
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int owd_platform_el_wait(
|
||||||
|
struct owd_eventloop *el,
|
||||||
|
owd_event_id_t *id_out,
|
||||||
|
uint32_t *flags_out,
|
||||||
|
const struct timespec *timeout)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int owd_platform_el_add_timer(
|
||||||
|
struct owd_eventloop *el,
|
||||||
|
struct owd_event *e,
|
||||||
|
uint64_t millis,
|
||||||
|
bool oneshot)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int owd_platform_el_add_fd(
|
||||||
|
struct owd_eventloop *el,
|
||||||
|
struct owd_event *e,
|
||||||
|
int fd,
|
||||||
|
uint32_t flags)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue