dect
/
libdect
Archived
13
0
Fork 0
This repository has been archived on 2022-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
libdect/example/event_ops.c

116 lines
2.3 KiB
C

#include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
#include <signal.h>
#include <event.h>
#include <libdect.h>
#include "common.h"
struct dect_handle *dh;
static void event_callback(int fd, short mask, void *data)
{
struct dect_fd *dfd = data;
uint32_t events;
events = 0;
if (mask & EV_READ)
events |= DECT_FD_READ;
if (mask & EV_WRITE)
events |= DECT_FD_WRITE;
dfd->callback(dh, dfd, events);
}
static int register_fd(const struct dect_handle *dh, struct dect_fd *dfd,
uint32_t events)
{
struct event *ev = (struct event *)dfd->priv;
unsigned short mask;
mask = EV_PERSIST;
if (events & DECT_FD_READ)
mask |= EV_READ;
if (events & DECT_FD_WRITE)
mask |= EV_WRITE;
event_set(ev, dfd->fd, mask, event_callback, dfd);
event_add(ev, NULL);
return 0;
}
static void unregister_fd(const struct dect_handle *dh, struct dect_fd *dfd)
{
struct event *ev = (struct event *)dfd->priv;
event_del(ev);
}
static void timer_expire(int fd, short mask, void *data)
{
struct dect_timer *timer = data;
timer->callback(dh, timer);
}
static void start_timer(const struct dect_handle *dh,
struct dect_timer *timer,
const struct timeval *tv)
{
struct event *ev = (struct event *)timer->priv;
evtimer_set(ev, timer_expire, timer);
evtimer_add(ev, (struct timeval *)tv);
}
static void stop_timer(const struct dect_handle *dh, struct dect_timer *timer)
{
struct event *ev = (struct event *)timer->priv;
evtimer_del(ev);
}
static const struct dect_event_ops dect_event_ops = {
.fd_priv_size = sizeof(struct event),
.register_fd = register_fd,
.unregister_fd = unregister_fd,
.timer_priv_size = sizeof(struct event),
.start_timer = start_timer,
.stop_timer = stop_timer
};
static struct event_base *ev_base;
static struct event sig_event;
static bool sigint;
static void sig_callback(int fd, short event, void *data)
{
sigint = true;
}
int dect_event_ops_init(struct dect_ops *ops)
{
ev_base = event_init();
if (ev_base == NULL)
return -1;
ops->event_ops = &dect_event_ops;
signal_set(&sig_event, SIGINT, sig_callback, NULL);
signal_add(&sig_event, NULL);
return 0;
}
void dect_event_loop(void)
{
while (!sigint)
event_loop(EVLOOP_ONCE);
signal_del(&sig_event);
}
void dect_event_ops_cleanup(void)
{
event_base_free(ev_base);
}