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