1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker * lws-minimal-http-server-eventlib-foreign
3*1c60b9acSAndroid Build Coastguard Worker *
4*1c60b9acSAndroid Build Coastguard Worker * Written in 2020 by Christian Fuchs <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker *
6*1c60b9acSAndroid Build Coastguard Worker * This file is made available under the Creative Commons CC0 1.0
7*1c60b9acSAndroid Build Coastguard Worker * Universal Public Domain Dedication.
8*1c60b9acSAndroid Build Coastguard Worker *
9*1c60b9acSAndroid Build Coastguard Worker * The sdevent specific code
10*1c60b9acSAndroid Build Coastguard Worker */
11*1c60b9acSAndroid Build Coastguard Worker
12*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
13*1c60b9acSAndroid Build Coastguard Worker
14*1c60b9acSAndroid Build Coastguard Worker #include <string.h>
15*1c60b9acSAndroid Build Coastguard Worker #include <signal.h>
16*1c60b9acSAndroid Build Coastguard Worker
17*1c60b9acSAndroid Build Coastguard Worker #include <systemd/sd-event.h>
18*1c60b9acSAndroid Build Coastguard Worker
19*1c60b9acSAndroid Build Coastguard Worker #include "private.h"
20*1c60b9acSAndroid Build Coastguard Worker
21*1c60b9acSAndroid Build Coastguard Worker static struct sd_event *sd_loop;
22*1c60b9acSAndroid Build Coastguard Worker static sd_event_source *sd_timer;
23*1c60b9acSAndroid Build Coastguard Worker static sd_event_source *sd_signal;
24*1c60b9acSAndroid Build Coastguard Worker
25*1c60b9acSAndroid Build Coastguard Worker static int
timer_cb_sd(sd_event_source * source,uint64_t now,void * user)26*1c60b9acSAndroid Build Coastguard Worker timer_cb_sd(sd_event_source *source, uint64_t now, void *user)
27*1c60b9acSAndroid Build Coastguard Worker {
28*1c60b9acSAndroid Build Coastguard Worker foreign_timer_service(sd_loop);
29*1c60b9acSAndroid Build Coastguard Worker
30*1c60b9acSAndroid Build Coastguard Worker if (sd_timer) {
31*1c60b9acSAndroid Build Coastguard Worker sd_event_source_set_time(sd_timer, now + 1000000);
32*1c60b9acSAndroid Build Coastguard Worker sd_event_source_set_enabled(sd_timer, SD_EVENT_ON);
33*1c60b9acSAndroid Build Coastguard Worker }
34*1c60b9acSAndroid Build Coastguard Worker
35*1c60b9acSAndroid Build Coastguard Worker return 0;
36*1c60b9acSAndroid Build Coastguard Worker }
37*1c60b9acSAndroid Build Coastguard Worker
38*1c60b9acSAndroid Build Coastguard Worker static int
signal_cb_sd(sd_event_source * source,const struct signalfd_siginfo * si,void * user)39*1c60b9acSAndroid Build Coastguard Worker signal_cb_sd(sd_event_source *source, const struct signalfd_siginfo *si,
40*1c60b9acSAndroid Build Coastguard Worker void *user)
41*1c60b9acSAndroid Build Coastguard Worker {
42*1c60b9acSAndroid Build Coastguard Worker signal_cb((int)si->ssi_signo);
43*1c60b9acSAndroid Build Coastguard Worker return 0;
44*1c60b9acSAndroid Build Coastguard Worker }
45*1c60b9acSAndroid Build Coastguard Worker
46*1c60b9acSAndroid Build Coastguard Worker static void
foreign_event_loop_init_and_run_libsdevent(void)47*1c60b9acSAndroid Build Coastguard Worker foreign_event_loop_init_and_run_libsdevent(void)
48*1c60b9acSAndroid Build Coastguard Worker {
49*1c60b9acSAndroid Build Coastguard Worker uint64_t now;
50*1c60b9acSAndroid Build Coastguard Worker
51*1c60b9acSAndroid Build Coastguard Worker /* we create and start our "foreign loop" */
52*1c60b9acSAndroid Build Coastguard Worker
53*1c60b9acSAndroid Build Coastguard Worker sd_event_default(&sd_loop);
54*1c60b9acSAndroid Build Coastguard Worker sd_event_add_signal(sd_loop, &sd_signal, SIGINT, signal_cb_sd, NULL);
55*1c60b9acSAndroid Build Coastguard Worker
56*1c60b9acSAndroid Build Coastguard Worker sd_event_now(sd_loop, CLOCK_MONOTONIC, &now);
57*1c60b9acSAndroid Build Coastguard Worker sd_event_add_time(sd_loop, &sd_timer, CLOCK_MONOTONIC, now,
58*1c60b9acSAndroid Build Coastguard Worker (uint64_t) 1000, timer_cb_sd, NULL);
59*1c60b9acSAndroid Build Coastguard Worker
60*1c60b9acSAndroid Build Coastguard Worker sd_event_loop(sd_loop);
61*1c60b9acSAndroid Build Coastguard Worker }
62*1c60b9acSAndroid Build Coastguard Worker
63*1c60b9acSAndroid Build Coastguard Worker static void
foreign_event_loop_stop_libsdevent(void)64*1c60b9acSAndroid Build Coastguard Worker foreign_event_loop_stop_libsdevent(void)
65*1c60b9acSAndroid Build Coastguard Worker {
66*1c60b9acSAndroid Build Coastguard Worker sd_event_exit(sd_loop, 0);
67*1c60b9acSAndroid Build Coastguard Worker }
68*1c60b9acSAndroid Build Coastguard Worker
69*1c60b9acSAndroid Build Coastguard Worker static void
foreign_event_loop_cleanup_libsdevent(void)70*1c60b9acSAndroid Build Coastguard Worker foreign_event_loop_cleanup_libsdevent(void)
71*1c60b9acSAndroid Build Coastguard Worker {
72*1c60b9acSAndroid Build Coastguard Worker sd_event_source_set_enabled(sd_timer, SD_EVENT_OFF);
73*1c60b9acSAndroid Build Coastguard Worker sd_timer = sd_event_source_unref(sd_timer);
74*1c60b9acSAndroid Build Coastguard Worker
75*1c60b9acSAndroid Build Coastguard Worker sd_event_source_set_enabled(sd_signal, SD_EVENT_OFF);
76*1c60b9acSAndroid Build Coastguard Worker sd_signal = sd_event_source_unref(sd_signal);
77*1c60b9acSAndroid Build Coastguard Worker
78*1c60b9acSAndroid Build Coastguard Worker sd_loop = sd_event_unref(sd_loop);
79*1c60b9acSAndroid Build Coastguard Worker }
80*1c60b9acSAndroid Build Coastguard Worker
81*1c60b9acSAndroid Build Coastguard Worker const struct ops ops_sdevent = {
82*1c60b9acSAndroid Build Coastguard Worker foreign_event_loop_init_and_run_libsdevent,
83*1c60b9acSAndroid Build Coastguard Worker foreign_event_loop_stop_libsdevent,
84*1c60b9acSAndroid Build Coastguard Worker foreign_event_loop_cleanup_libsdevent
85*1c60b9acSAndroid Build Coastguard Worker };
86*1c60b9acSAndroid Build Coastguard Worker
87