File: glib.c

package info (click to toggle)
libwebsockets 4.3.5-2
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 31,288 kB
  • sloc: ansic: 194,407; javascript: 1,550; sh: 1,387; cpp: 505; java: 461; perl: 405; xml: 118; makefile: 76; awk: 5
file content (96 lines) | stat: -rw-r--r-- 2,077 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
 * lws-minimal-http-server-eventlib-foreign
 *
 * Written in 2010-2020 by Andy Green <andy@warmcat.com>
 *
 * This file is made available under the Creative Commons CC0 1.0
 * Universal Public Domain Dedication.
 *
 * The glib specific code
 */

#include <libwebsockets.h>

#include <string.h>
#include <signal.h>

#include <glib-2.0/glib.h>
#include <glib-unix.h>

#include "private.h"

#if !defined(G_SOURCE_FUNC)
#define G_SOURCE_FUNC(f) ((GSourceFunc) (void (*)(void)) (f))
#endif

typedef struct lws_glib_tag {
	GSource			*gs;
	guint			tag;
} lws_glib_tag_t;

#define lws_gs_valid(t)		  (t.gs)
#define lws_gs_destroy(t)	  if (lws_gs_valid(t)) { \
					g_source_remove(t.tag); \
					g_source_unref(t.gs); \
					t.gs = NULL; t.tag = 0; }

static GMainLoop *loop_glib;
static lws_glib_tag_t timer_outer_glib, sighandler_glib;

static int
timer_cb_glib(void *p)
{
	foreign_timer_service(loop_glib);
	return 1;
}

static void
signal_cb_glib(void *p)
{
	signal_cb(SIGINT);
}

static void
foreign_event_loop_init_and_run_glib(void)
{
	/* we create and start our "foreign loop" */

	loop_glib = g_main_loop_new(NULL, 0);

	sighandler_glib.gs = g_unix_signal_source_new(SIGINT);
	g_source_set_callback(sighandler_glib.gs, G_SOURCE_FUNC(signal_cb_glib),
			      NULL, NULL);
	sighandler_glib.tag = g_source_attach(sighandler_glib.gs,
					    g_main_loop_get_context(loop_glib));

	timer_outer_glib.gs = g_timeout_source_new(1000);
	g_source_set_callback(timer_outer_glib.gs, timer_cb_glib, NULL, NULL);
	timer_outer_glib.tag = g_source_attach(timer_outer_glib.gs,
					   g_main_loop_get_context(loop_glib));

	g_main_loop_run(loop_glib);
}

static void
foreign_event_loop_stop_glib(void)
{
	g_main_loop_quit(loop_glib);
}

static void
foreign_event_loop_cleanup_glib(void)
{
	/* cleanup the foreign loop assets */

	lws_gs_destroy(sighandler_glib);
	lws_gs_destroy(timer_outer_glib);

	g_main_loop_unref(loop_glib);
	loop_glib = NULL;
}

const struct ops ops_glib = {
	foreign_event_loop_init_and_run_glib,
	foreign_event_loop_stop_glib,
	foreign_event_loop_cleanup_glib
};