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 libuv specific code 10d4afb5ceSopenharmony_ci */ 11d4afb5ceSopenharmony_ci 12d4afb5ceSopenharmony_ci#include <libwebsockets.h> 13d4afb5ceSopenharmony_ci 14d4afb5ceSopenharmony_ci#include <string.h> 15d4afb5ceSopenharmony_ci#include <signal.h> 16d4afb5ceSopenharmony_ci 17d4afb5ceSopenharmony_ci#include <uv.h> 18d4afb5ceSopenharmony_ci#ifdef LWS_HAVE_UV_VERSION_H 19d4afb5ceSopenharmony_ci#include <uv-version.h> 20d4afb5ceSopenharmony_ci#endif 21d4afb5ceSopenharmony_ci#ifdef LWS_HAVE_NEW_UV_VERSION_H 22d4afb5ceSopenharmony_ci#include <uv/version.h> 23d4afb5ceSopenharmony_ci#endif 24d4afb5ceSopenharmony_ci 25d4afb5ceSopenharmony_ci#include "private.h" 26d4afb5ceSopenharmony_ci 27d4afb5ceSopenharmony_cistatic uv_loop_t loop_uv; 28d4afb5ceSopenharmony_cistatic uv_timer_t timer_outer_uv; 29d4afb5ceSopenharmony_cistatic uv_signal_t sighandler_uv; 30d4afb5ceSopenharmony_ci 31d4afb5ceSopenharmony_cistatic void 32d4afb5ceSopenharmony_citimer_cb_uv(uv_timer_t *t) 33d4afb5ceSopenharmony_ci{ 34d4afb5ceSopenharmony_ci foreign_timer_service(&loop_uv); 35d4afb5ceSopenharmony_ci} 36d4afb5ceSopenharmony_ci 37d4afb5ceSopenharmony_cistatic void 38d4afb5ceSopenharmony_cisignal_cb_uv(uv_signal_t *watcher, int signum) 39d4afb5ceSopenharmony_ci{ 40d4afb5ceSopenharmony_ci signal_cb(signum); 41d4afb5ceSopenharmony_ci} 42d4afb5ceSopenharmony_ci 43d4afb5ceSopenharmony_cistatic void 44d4afb5ceSopenharmony_ciforeign_event_loop_init_and_run_libuv(void) 45d4afb5ceSopenharmony_ci{ 46d4afb5ceSopenharmony_ci /* we create and start our "foreign loop" */ 47d4afb5ceSopenharmony_ci 48d4afb5ceSopenharmony_ci#if (UV_VERSION_MAJOR > 0) // Travis... 49d4afb5ceSopenharmony_ci uv_loop_init(&loop_uv); 50d4afb5ceSopenharmony_ci#endif 51d4afb5ceSopenharmony_ci uv_signal_init(&loop_uv, &sighandler_uv); 52d4afb5ceSopenharmony_ci uv_signal_start(&sighandler_uv, signal_cb_uv, SIGINT); 53d4afb5ceSopenharmony_ci 54d4afb5ceSopenharmony_ci uv_timer_init(&loop_uv, &timer_outer_uv); 55d4afb5ceSopenharmony_ci#if (UV_VERSION_MAJOR > 0) // Travis... 56d4afb5ceSopenharmony_ci uv_timer_start(&timer_outer_uv, timer_cb_uv, 0, 1000); 57d4afb5ceSopenharmony_ci#else 58d4afb5ceSopenharmony_ci (void)timer_cb_uv; 59d4afb5ceSopenharmony_ci#endif 60d4afb5ceSopenharmony_ci 61d4afb5ceSopenharmony_ci uv_run(&loop_uv, UV_RUN_DEFAULT); 62d4afb5ceSopenharmony_ci} 63d4afb5ceSopenharmony_ci 64d4afb5ceSopenharmony_cistatic void 65d4afb5ceSopenharmony_ciforeign_event_loop_stop_libuv(void) 66d4afb5ceSopenharmony_ci{ 67d4afb5ceSopenharmony_ci uv_stop(&loop_uv); 68d4afb5ceSopenharmony_ci} 69d4afb5ceSopenharmony_ci 70d4afb5ceSopenharmony_cistatic void 71d4afb5ceSopenharmony_ciforeign_event_loop_cleanup_libuv(void) 72d4afb5ceSopenharmony_ci{ 73d4afb5ceSopenharmony_ci /* cleanup the foreign loop assets */ 74d4afb5ceSopenharmony_ci 75d4afb5ceSopenharmony_ci uv_timer_stop(&timer_outer_uv); 76d4afb5ceSopenharmony_ci uv_close((uv_handle_t*)&timer_outer_uv, NULL); 77d4afb5ceSopenharmony_ci uv_signal_stop(&sighandler_uv); 78d4afb5ceSopenharmony_ci uv_close((uv_handle_t *)&sighandler_uv, NULL); 79d4afb5ceSopenharmony_ci 80d4afb5ceSopenharmony_ci uv_run(&loop_uv, UV_RUN_DEFAULT); 81d4afb5ceSopenharmony_ci#if (UV_VERSION_MAJOR > 0) // Travis... 82d4afb5ceSopenharmony_ci uv_loop_close(&loop_uv); 83d4afb5ceSopenharmony_ci#endif 84d4afb5ceSopenharmony_ci} 85d4afb5ceSopenharmony_ci 86d4afb5ceSopenharmony_ciconst struct ops ops_libuv = { 87d4afb5ceSopenharmony_ci foreign_event_loop_init_and_run_libuv, 88d4afb5ceSopenharmony_ci foreign_event_loop_stop_libuv, 89d4afb5ceSopenharmony_ci foreign_event_loop_cleanup_libuv 90d4afb5ceSopenharmony_ci}; 91d4afb5ceSopenharmony_ci 92