1d4afb5ceSopenharmony_ci/*
2d4afb5ceSopenharmony_ci * lws-minimal-http-server-eventlib-foreign
3d4afb5ceSopenharmony_ci *
4d4afb5ceSopenharmony_ci * Written in 2010-2020 by Andy Green <andy@warmcat.com>
5d4afb5ceSopenharmony_ci *
6d4afb5ceSopenharmony_ci * This file is made available under the Creative Commons CC0 1.0
7d4afb5ceSopenharmony_ci * Universal Public Domain Dedication.
8d4afb5ceSopenharmony_ci *
9d4afb5ceSopenharmony_ci * The libevent specific code
10d4afb5ceSopenharmony_ci */
11d4afb5ceSopenharmony_ci
12d4afb5ceSopenharmony_ci#include <libwebsockets.h>
13d4afb5ceSopenharmony_ci
14d4afb5ceSopenharmony_ci#include <event2/event.h>
15d4afb5ceSopenharmony_ci
16d4afb5ceSopenharmony_ci#include <string.h>
17d4afb5ceSopenharmony_ci#include <signal.h>
18d4afb5ceSopenharmony_ci
19d4afb5ceSopenharmony_ci#include "private.h"
20d4afb5ceSopenharmony_ci
21d4afb5ceSopenharmony_cistatic struct event_base *loop_event;
22d4afb5ceSopenharmony_cistatic struct event *timer_outer_event;
23d4afb5ceSopenharmony_cistatic struct event *sighandler_event;
24d4afb5ceSopenharmony_ci
25d4afb5ceSopenharmony_cistatic void
26d4afb5ceSopenharmony_citimer_cb_event(evutil_socket_t fd, short event, void *arg)
27d4afb5ceSopenharmony_ci{
28d4afb5ceSopenharmony_ci	foreign_timer_service(loop_event);
29d4afb5ceSopenharmony_ci}
30d4afb5ceSopenharmony_ci
31d4afb5ceSopenharmony_cistatic void
32d4afb5ceSopenharmony_cisignal_cb_event(evutil_socket_t fd, short event, void *arg)
33d4afb5ceSopenharmony_ci{
34d4afb5ceSopenharmony_ci	signal_cb((int)(lws_intptr_t)arg);
35d4afb5ceSopenharmony_ci}
36d4afb5ceSopenharmony_ci
37d4afb5ceSopenharmony_cistatic void
38d4afb5ceSopenharmony_ciforeign_event_loop_init_and_run_libevent(void)
39d4afb5ceSopenharmony_ci{
40d4afb5ceSopenharmony_ci	struct timeval tv;
41d4afb5ceSopenharmony_ci
42d4afb5ceSopenharmony_ci	/* we create and start our "foreign loop" */
43d4afb5ceSopenharmony_ci
44d4afb5ceSopenharmony_ci	tv.tv_sec = 1;
45d4afb5ceSopenharmony_ci	tv.tv_usec = 0;
46d4afb5ceSopenharmony_ci	event_enable_debug_mode();
47d4afb5ceSopenharmony_ci
48d4afb5ceSopenharmony_ci	loop_event = event_base_new();
49d4afb5ceSopenharmony_ci	sighandler_event = evsignal_new((struct event_base *)loop_event, SIGINT, signal_cb_event,
50d4afb5ceSopenharmony_ci                                       (void*)SIGINT);
51d4afb5ceSopenharmony_ci
52d4afb5ceSopenharmony_ci	timer_outer_event = event_new((struct event_base *)loop_event, -1, EV_PERSIST,
53d4afb5ceSopenharmony_ci                                     timer_cb_event, NULL);
54d4afb5ceSopenharmony_ci	//evtimer_new(loop_event, timer_cb_event, NULL);
55d4afb5ceSopenharmony_ci	evtimer_add(timer_outer_event, &tv);
56d4afb5ceSopenharmony_ci
57d4afb5ceSopenharmony_ci	event_base_loop(loop_event, 0);
58d4afb5ceSopenharmony_ci}
59d4afb5ceSopenharmony_ci
60d4afb5ceSopenharmony_cistatic void
61d4afb5ceSopenharmony_ciforeign_event_loop_stop_libevent(void)
62d4afb5ceSopenharmony_ci{
63d4afb5ceSopenharmony_ci	event_base_loopexit(loop_event, NULL);
64d4afb5ceSopenharmony_ci}
65d4afb5ceSopenharmony_ci
66d4afb5ceSopenharmony_cistatic void
67d4afb5ceSopenharmony_ciforeign_event_loop_cleanup_libevent(void)
68d4afb5ceSopenharmony_ci{
69d4afb5ceSopenharmony_ci	/* cleanup the foreign loop assets */
70d4afb5ceSopenharmony_ci
71d4afb5ceSopenharmony_ci	evtimer_del(timer_outer_event);
72d4afb5ceSopenharmony_ci	event_free(timer_outer_event);
73d4afb5ceSopenharmony_ci	evsignal_del(sighandler_event);
74d4afb5ceSopenharmony_ci	event_free(sighandler_event);
75d4afb5ceSopenharmony_ci
76d4afb5ceSopenharmony_ci	event_base_loop(loop_event, 0);
77d4afb5ceSopenharmony_ci	event_base_free(loop_event);
78d4afb5ceSopenharmony_ci}
79d4afb5ceSopenharmony_ci
80d4afb5ceSopenharmony_ciconst struct ops ops_libevent = {
81d4afb5ceSopenharmony_ci	foreign_event_loop_init_and_run_libevent,
82d4afb5ceSopenharmony_ci	foreign_event_loop_stop_libevent,
83d4afb5ceSopenharmony_ci	foreign_event_loop_cleanup_libevent
84d4afb5ceSopenharmony_ci};
85