1/* 2 * lws-minimal-http-server-eventlib-foreign 3 * 4 * Written in 2010-2020 by Andy Green <andy@warmcat.com> 5 * 6 * This file is made available under the Creative Commons CC0 1.0 7 * Universal Public Domain Dedication. 8 * 9 * The libuv specific code 10 */ 11 12#include <libwebsockets.h> 13 14#include <string.h> 15#include <signal.h> 16 17#include <uv.h> 18#ifdef LWS_HAVE_UV_VERSION_H 19#include <uv-version.h> 20#endif 21#ifdef LWS_HAVE_NEW_UV_VERSION_H 22#include <uv/version.h> 23#endif 24 25#include "private.h" 26 27static uv_loop_t loop_uv; 28static uv_timer_t timer_outer_uv; 29static uv_signal_t sighandler_uv; 30 31static void 32timer_cb_uv(uv_timer_t *t) 33{ 34 foreign_timer_service(&loop_uv); 35} 36 37static void 38signal_cb_uv(uv_signal_t *watcher, int signum) 39{ 40 signal_cb(signum); 41} 42 43static void 44foreign_event_loop_init_and_run_libuv(void) 45{ 46 /* we create and start our "foreign loop" */ 47 48#if (UV_VERSION_MAJOR > 0) // Travis... 49 uv_loop_init(&loop_uv); 50#endif 51 uv_signal_init(&loop_uv, &sighandler_uv); 52 uv_signal_start(&sighandler_uv, signal_cb_uv, SIGINT); 53 54 uv_timer_init(&loop_uv, &timer_outer_uv); 55#if (UV_VERSION_MAJOR > 0) // Travis... 56 uv_timer_start(&timer_outer_uv, timer_cb_uv, 0, 1000); 57#else 58 (void)timer_cb_uv; 59#endif 60 61 uv_run(&loop_uv, UV_RUN_DEFAULT); 62} 63 64static void 65foreign_event_loop_stop_libuv(void) 66{ 67 uv_stop(&loop_uv); 68} 69 70static void 71foreign_event_loop_cleanup_libuv(void) 72{ 73 /* cleanup the foreign loop assets */ 74 75 uv_timer_stop(&timer_outer_uv); 76 uv_close((uv_handle_t*)&timer_outer_uv, NULL); 77 uv_signal_stop(&sighandler_uv); 78 uv_close((uv_handle_t *)&sighandler_uv, NULL); 79 80 uv_run(&loop_uv, UV_RUN_DEFAULT); 81#if (UV_VERSION_MAJOR > 0) // Travis... 82 uv_loop_close(&loop_uv); 83#endif 84} 85 86const struct ops ops_libuv = { 87 foreign_event_loop_init_and_run_libuv, 88 foreign_event_loop_stop_libuv, 89 foreign_event_loop_cleanup_libuv 90}; 91 92