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 libev specific code 10d4afb5ceSopenharmony_ci */ 11d4afb5ceSopenharmony_ci 12d4afb5ceSopenharmony_ci#include <libwebsockets.h> 13d4afb5ceSopenharmony_ci 14d4afb5ceSopenharmony_ci#include <ev.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 ev_loop *loop_ev; 22d4afb5ceSopenharmony_cistatic struct ev_timer timer_outer_ev; 23d4afb5ceSopenharmony_cistatic struct ev_signal sighandler_ev; 24d4afb5ceSopenharmony_ci 25d4afb5ceSopenharmony_cistatic void 26d4afb5ceSopenharmony_citimer_cb_ev(struct ev_loop *loop, struct ev_timer *watcher, int revents) 27d4afb5ceSopenharmony_ci{ 28d4afb5ceSopenharmony_ci foreign_timer_service(loop_ev); 29d4afb5ceSopenharmony_ci} 30d4afb5ceSopenharmony_ci 31d4afb5ceSopenharmony_cistatic void 32d4afb5ceSopenharmony_cisignal_cb_ev(struct ev_loop *loop, struct ev_signal *watcher, int revents) 33d4afb5ceSopenharmony_ci{ 34d4afb5ceSopenharmony_ci signal_cb(watcher->signum); 35d4afb5ceSopenharmony_ci} 36d4afb5ceSopenharmony_ci 37d4afb5ceSopenharmony_cistatic void 38d4afb5ceSopenharmony_ciforeign_event_loop_init_and_run_libev(void) 39d4afb5ceSopenharmony_ci{ 40d4afb5ceSopenharmony_ci /* we create and start our "foreign loop" */ 41d4afb5ceSopenharmony_ci 42d4afb5ceSopenharmony_ci loop_ev = ev_loop_new(0); 43d4afb5ceSopenharmony_ci 44d4afb5ceSopenharmony_ci ev_signal_init(&sighandler_ev, signal_cb_ev, SIGINT); 45d4afb5ceSopenharmony_ci ev_signal_start(loop_ev, &sighandler_ev); 46d4afb5ceSopenharmony_ci 47d4afb5ceSopenharmony_ci ev_timer_init(&timer_outer_ev, timer_cb_ev, 0, 1); 48d4afb5ceSopenharmony_ci ev_timer_start(loop_ev, &timer_outer_ev); 49d4afb5ceSopenharmony_ci 50d4afb5ceSopenharmony_ci ev_run(loop_ev, 0); 51d4afb5ceSopenharmony_ci} 52d4afb5ceSopenharmony_ci 53d4afb5ceSopenharmony_cistatic void 54d4afb5ceSopenharmony_ciforeign_event_loop_stop_libev(void) 55d4afb5ceSopenharmony_ci{ 56d4afb5ceSopenharmony_ci ev_break(loop_ev, EVBREAK_ALL); 57d4afb5ceSopenharmony_ci} 58d4afb5ceSopenharmony_ci 59d4afb5ceSopenharmony_cistatic void 60d4afb5ceSopenharmony_ciforeign_event_loop_cleanup_libev(void) 61d4afb5ceSopenharmony_ci{ 62d4afb5ceSopenharmony_ci /* cleanup the foreign loop assets */ 63d4afb5ceSopenharmony_ci 64d4afb5ceSopenharmony_ci ev_timer_stop(loop_ev, &timer_outer_ev); 65d4afb5ceSopenharmony_ci ev_signal_stop(loop_ev, &sighandler_ev); 66d4afb5ceSopenharmony_ci 67d4afb5ceSopenharmony_ci ev_run(loop_ev, 0); 68d4afb5ceSopenharmony_ci ev_loop_destroy(loop_ev); 69d4afb5ceSopenharmony_ci} 70d4afb5ceSopenharmony_ci 71d4afb5ceSopenharmony_ciconst struct ops ops_libev = { 72d4afb5ceSopenharmony_ci foreign_event_loop_init_and_run_libev, 73d4afb5ceSopenharmony_ci foreign_event_loop_stop_libev, 74d4afb5ceSopenharmony_ci foreign_event_loop_cleanup_libev 75d4afb5ceSopenharmony_ci}; 76d4afb5ceSopenharmony_ci 77