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 glib 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 <glib-2.0/glib.h> 18d4afb5ceSopenharmony_ci#include <glib-unix.h> 19d4afb5ceSopenharmony_ci 20d4afb5ceSopenharmony_ci#include "private.h" 21d4afb5ceSopenharmony_ci 22d4afb5ceSopenharmony_ci#if !defined(G_SOURCE_FUNC) 23d4afb5ceSopenharmony_ci#define G_SOURCE_FUNC(f) ((GSourceFunc) (void (*)(void)) (f)) 24d4afb5ceSopenharmony_ci#endif 25d4afb5ceSopenharmony_ci 26d4afb5ceSopenharmony_citypedef struct lws_glib_tag { 27d4afb5ceSopenharmony_ci GSource *gs; 28d4afb5ceSopenharmony_ci guint tag; 29d4afb5ceSopenharmony_ci} lws_glib_tag_t; 30d4afb5ceSopenharmony_ci 31d4afb5ceSopenharmony_ci#define lws_gs_valid(t) (t.gs) 32d4afb5ceSopenharmony_ci#define lws_gs_destroy(t) if (lws_gs_valid(t)) { \ 33d4afb5ceSopenharmony_ci g_source_remove(t.tag); \ 34d4afb5ceSopenharmony_ci g_source_unref(t.gs); \ 35d4afb5ceSopenharmony_ci t.gs = NULL; t.tag = 0; } 36d4afb5ceSopenharmony_ci 37d4afb5ceSopenharmony_cistatic GMainLoop *loop_glib; 38d4afb5ceSopenharmony_cistatic lws_glib_tag_t timer_outer_glib, sighandler_glib; 39d4afb5ceSopenharmony_ci 40d4afb5ceSopenharmony_cistatic int 41d4afb5ceSopenharmony_citimer_cb_glib(void *p) 42d4afb5ceSopenharmony_ci{ 43d4afb5ceSopenharmony_ci foreign_timer_service(loop_glib); 44d4afb5ceSopenharmony_ci return 1; 45d4afb5ceSopenharmony_ci} 46d4afb5ceSopenharmony_ci 47d4afb5ceSopenharmony_cistatic void 48d4afb5ceSopenharmony_cisignal_cb_glib(void *p) 49d4afb5ceSopenharmony_ci{ 50d4afb5ceSopenharmony_ci signal_cb(SIGINT); 51d4afb5ceSopenharmony_ci} 52d4afb5ceSopenharmony_ci 53d4afb5ceSopenharmony_cistatic void 54d4afb5ceSopenharmony_ciforeign_event_loop_init_and_run_glib(void) 55d4afb5ceSopenharmony_ci{ 56d4afb5ceSopenharmony_ci /* we create and start our "foreign loop" */ 57d4afb5ceSopenharmony_ci 58d4afb5ceSopenharmony_ci loop_glib = g_main_loop_new(NULL, 0); 59d4afb5ceSopenharmony_ci 60d4afb5ceSopenharmony_ci sighandler_glib.gs = g_unix_signal_source_new(SIGINT); 61d4afb5ceSopenharmony_ci g_source_set_callback(sighandler_glib.gs, G_SOURCE_FUNC(signal_cb_glib), 62d4afb5ceSopenharmony_ci NULL, NULL); 63d4afb5ceSopenharmony_ci sighandler_glib.tag = g_source_attach(sighandler_glib.gs, 64d4afb5ceSopenharmony_ci g_main_loop_get_context(loop_glib)); 65d4afb5ceSopenharmony_ci 66d4afb5ceSopenharmony_ci timer_outer_glib.gs = g_timeout_source_new(1000); 67d4afb5ceSopenharmony_ci g_source_set_callback(timer_outer_glib.gs, timer_cb_glib, NULL, NULL); 68d4afb5ceSopenharmony_ci timer_outer_glib.tag = g_source_attach(timer_outer_glib.gs, 69d4afb5ceSopenharmony_ci g_main_loop_get_context(loop_glib)); 70d4afb5ceSopenharmony_ci 71d4afb5ceSopenharmony_ci g_main_loop_run(loop_glib); 72d4afb5ceSopenharmony_ci} 73d4afb5ceSopenharmony_ci 74d4afb5ceSopenharmony_cistatic void 75d4afb5ceSopenharmony_ciforeign_event_loop_stop_glib(void) 76d4afb5ceSopenharmony_ci{ 77d4afb5ceSopenharmony_ci g_main_loop_quit(loop_glib); 78d4afb5ceSopenharmony_ci} 79d4afb5ceSopenharmony_ci 80d4afb5ceSopenharmony_cistatic void 81d4afb5ceSopenharmony_ciforeign_event_loop_cleanup_glib(void) 82d4afb5ceSopenharmony_ci{ 83d4afb5ceSopenharmony_ci /* cleanup the foreign loop assets */ 84d4afb5ceSopenharmony_ci 85d4afb5ceSopenharmony_ci lws_gs_destroy(sighandler_glib); 86d4afb5ceSopenharmony_ci lws_gs_destroy(timer_outer_glib); 87d4afb5ceSopenharmony_ci 88d4afb5ceSopenharmony_ci g_main_loop_unref(loop_glib); 89d4afb5ceSopenharmony_ci loop_glib = NULL; 90d4afb5ceSopenharmony_ci} 91d4afb5ceSopenharmony_ci 92d4afb5ceSopenharmony_ciconst struct ops ops_glib = { 93d4afb5ceSopenharmony_ci foreign_event_loop_init_and_run_glib, 94d4afb5ceSopenharmony_ci foreign_event_loop_stop_glib, 95d4afb5ceSopenharmony_ci foreign_event_loop_cleanup_glib 96d4afb5ceSopenharmony_ci}; 97