/*
 * lws-minimal-http-server-eventlib-foreign
 *
 * Written in 2010-2020 by Andy Green <andy@warmcat.com>
 *
 * This file is made available under the Creative Commons CC0 1.0
 * Universal Public Domain Dedication.
 *
 * The libevent specific code
 */

#include <libwebsockets.h>

#include <event2/event.h>

#include <string.h>
#include <signal.h>

#include "private.h"

static struct event_base *loop_event;
static struct event *timer_outer_event;
static struct event *sighandler_event;

static void
timer_cb_event(evutil_socket_t fd, short event, void *arg)
{
	foreign_timer_service(loop_event);
}

static void
signal_cb_event(evutil_socket_t fd, short event, void *arg)
{
	signal_cb((int)(lws_intptr_t)arg);
}

static void
foreign_event_loop_init_and_run_libevent(void)
{
	struct timeval tv;

	/* we create and start our "foreign loop" */

	tv.tv_sec = 1;
	tv.tv_usec = 0;

	loop_event = event_base_new();

	sighandler_event = evsignal_new((struct event_base *)loop_event, SIGINT, signal_cb_event,
                                       (void*)SIGINT);

	timer_outer_event = event_new((struct event_base *)loop_event, -1, EV_PERSIST,
                                     timer_cb_event, NULL);
	//evtimer_new(loop_event, timer_cb_event, NULL);
	evtimer_add(timer_outer_event, &tv);

	event_base_loop(loop_event, 0);
}

static void
foreign_event_loop_stop_libevent(void)
{
	event_base_loopexit(loop_event, NULL);
}

static void
foreign_event_loop_cleanup_libevent(void)
{
	/* cleanup the foreign loop assets */

	evtimer_del(timer_outer_event);
	event_free(timer_outer_event);
	evsignal_del(sighandler_event);
	event_free(sighandler_event);

	event_base_loop(loop_event, 0);
	event_base_free(loop_event);
}

const struct ops ops_libevent = {
	foreign_event_loop_init_and_run_libevent,
	foreign_event_loop_stop_libevent,
	foreign_event_loop_cleanup_libevent
};
