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