1 /*
2 * lws-minimal-http-server-eventlib-foreign
3 *
4 * Written in 2010-2020 by Andy Green <[email protected]>
5 *
6 * This file is made available under the Creative Commons CC0 1.0
7 * Universal Public Domain Dedication.
8 *
9 * The glib specific code
10 */
11
12 #include <libwebsockets.h>
13
14 #include <string.h>
15 #include <signal.h>
16
17 #include <glib-2.0/glib.h>
18 #include <glib-unix.h>
19
20 #include "private.h"
21
22 #if !defined(G_SOURCE_FUNC)
23 #define G_SOURCE_FUNC(f) ((GSourceFunc) (void (*)(void)) (f))
24 #endif
25
26 typedef struct lws_glib_tag {
27 GSource *gs;
28 guint tag;
29 } lws_glib_tag_t;
30
31 #define lws_gs_valid(t) (t.gs)
32 #define lws_gs_destroy(t) if (lws_gs_valid(t)) { \
33 g_source_remove(t.tag); \
34 g_source_unref(t.gs); \
35 t.gs = NULL; t.tag = 0; }
36
37 static GMainLoop *loop_glib;
38 static lws_glib_tag_t timer_outer_glib, sighandler_glib;
39
40 static int
timer_cb_glib(void * p)41 timer_cb_glib(void *p)
42 {
43 foreign_timer_service(loop_glib);
44 return 1;
45 }
46
47 static void
signal_cb_glib(void * p)48 signal_cb_glib(void *p)
49 {
50 signal_cb(SIGINT);
51 }
52
53 static void
foreign_event_loop_init_and_run_glib(void)54 foreign_event_loop_init_and_run_glib(void)
55 {
56 /* we create and start our "foreign loop" */
57
58 loop_glib = g_main_loop_new(NULL, 0);
59
60 sighandler_glib.gs = g_unix_signal_source_new(SIGINT);
61 g_source_set_callback(sighandler_glib.gs, G_SOURCE_FUNC(signal_cb_glib),
62 NULL, NULL);
63 sighandler_glib.tag = g_source_attach(sighandler_glib.gs,
64 g_main_loop_get_context(loop_glib));
65
66 timer_outer_glib.gs = g_timeout_source_new(1000);
67 g_source_set_callback(timer_outer_glib.gs, timer_cb_glib, NULL, NULL);
68 timer_outer_glib.tag = g_source_attach(timer_outer_glib.gs,
69 g_main_loop_get_context(loop_glib));
70
71 g_main_loop_run(loop_glib);
72 }
73
74 static void
foreign_event_loop_stop_glib(void)75 foreign_event_loop_stop_glib(void)
76 {
77 g_main_loop_quit(loop_glib);
78 }
79
80 static void
foreign_event_loop_cleanup_glib(void)81 foreign_event_loop_cleanup_glib(void)
82 {
83 /* cleanup the foreign loop assets */
84
85 lws_gs_destroy(sighandler_glib);
86 lws_gs_destroy(timer_outer_glib);
87
88 g_main_loop_unref(loop_glib);
89 loop_glib = NULL;
90 }
91
92 const struct ops ops_glib = {
93 foreign_event_loop_init_and_run_glib,
94 foreign_event_loop_stop_glib,
95 foreign_event_loop_cleanup_glib
96 };
97