blob: e2014cd6bd5bdbb3ae5f514ff88b9603b442fcbc [file] [log] [blame]
Andy Greenc6c7ab22020-08-27 15:37:14 +01001/*
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 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
22typedef struct lws_glib_tag {
23 GSource *gs;
24 guint tag;
25} lws_glib_tag_t;
26
27#define lws_gs_valid(t) (t.gs)
28#define lws_gs_destroy(t) if (lws_gs_valid(t)) { \
29 g_source_remove(t.tag); \
30 g_source_unref(t.gs); \
31 t.gs = NULL; t.tag = 0; }
32
33static GMainLoop *loop_glib;
34static lws_glib_tag_t timer_outer_glib, sighandler_glib;
35
36static int
37timer_cb_glib(void *p)
38{
39 foreign_timer_service(loop_glib);
40 return 1;
41}
42
43static void
44signal_cb_glib(void *p)
45{
46 signal_cb(SIGINT);
47}
48
49static void
50foreign_event_loop_init_and_run_glib(void)
51{
52 /* we create and start our "foreign loop" */
53
54 loop_glib = g_main_loop_new(NULL, 0);
55
56 sighandler_glib.gs = g_unix_signal_source_new(SIGINT);
57 g_source_set_callback(sighandler_glib.gs, G_SOURCE_FUNC(signal_cb_glib),
58 NULL, NULL);
59 sighandler_glib.tag = g_source_attach(sighandler_glib.gs,
60 g_main_loop_get_context(loop_glib));
61
62 timer_outer_glib.gs = g_timeout_source_new(1000);
63 g_source_set_callback(timer_outer_glib.gs, timer_cb_glib, NULL, NULL);
64 timer_outer_glib.tag = g_source_attach(timer_outer_glib.gs,
65 g_main_loop_get_context(loop_glib));
66
67 g_main_loop_run(loop_glib);
68}
69
70static void
71foreign_event_loop_stop_glib(void)
72{
73 g_main_loop_quit(loop_glib);
74}
75
76static void
77foreign_event_loop_cleanup_glib(void)
78{
79 /* cleanup the foreign loop assets */
80
81 lws_gs_destroy(sighandler_glib);
82 lws_gs_destroy(timer_outer_glib);
83
84 g_main_loop_unref(loop_glib);
85 loop_glib = NULL;
86}
87
88const struct ops ops_glib = {
89 foreign_event_loop_init_and_run_glib,
90 foreign_event_loop_stop_glib,
91 foreign_event_loop_cleanup_glib
92};