1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * lws-minimal-http-server-eventlib-foreign 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Written in 2020 by Christian Fuchs <christian.fuchs@scs.ch> 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 sdevent 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 <systemd/sd-event.h> 18d4afb5ceSopenharmony_ci 19d4afb5ceSopenharmony_ci#include "private.h" 20d4afb5ceSopenharmony_ci 21d4afb5ceSopenharmony_cistatic struct sd_event *sd_loop; 22d4afb5ceSopenharmony_cistatic sd_event_source *sd_timer; 23d4afb5ceSopenharmony_cistatic sd_event_source *sd_signal; 24d4afb5ceSopenharmony_ci 25d4afb5ceSopenharmony_cistatic int 26d4afb5ceSopenharmony_citimer_cb_sd(sd_event_source *source, uint64_t now, void *user) 27d4afb5ceSopenharmony_ci{ 28d4afb5ceSopenharmony_ci foreign_timer_service(sd_loop); 29d4afb5ceSopenharmony_ci 30d4afb5ceSopenharmony_ci if (sd_timer) { 31d4afb5ceSopenharmony_ci sd_event_source_set_time(sd_timer, now + 1000000); 32d4afb5ceSopenharmony_ci sd_event_source_set_enabled(sd_timer, SD_EVENT_ON); 33d4afb5ceSopenharmony_ci } 34d4afb5ceSopenharmony_ci 35d4afb5ceSopenharmony_ci return 0; 36d4afb5ceSopenharmony_ci} 37d4afb5ceSopenharmony_ci 38d4afb5ceSopenharmony_cistatic int 39d4afb5ceSopenharmony_cisignal_cb_sd(sd_event_source *source, const struct signalfd_siginfo *si, 40d4afb5ceSopenharmony_ci void *user) 41d4afb5ceSopenharmony_ci{ 42d4afb5ceSopenharmony_ci signal_cb((int)si->ssi_signo); 43d4afb5ceSopenharmony_ci return 0; 44d4afb5ceSopenharmony_ci} 45d4afb5ceSopenharmony_ci 46d4afb5ceSopenharmony_cistatic void 47d4afb5ceSopenharmony_ciforeign_event_loop_init_and_run_libsdevent(void) 48d4afb5ceSopenharmony_ci{ 49d4afb5ceSopenharmony_ci uint64_t now; 50d4afb5ceSopenharmony_ci 51d4afb5ceSopenharmony_ci /* we create and start our "foreign loop" */ 52d4afb5ceSopenharmony_ci 53d4afb5ceSopenharmony_ci sd_event_default(&sd_loop); 54d4afb5ceSopenharmony_ci sd_event_add_signal(sd_loop, &sd_signal, SIGINT, signal_cb_sd, NULL); 55d4afb5ceSopenharmony_ci 56d4afb5ceSopenharmony_ci sd_event_now(sd_loop, CLOCK_MONOTONIC, &now); 57d4afb5ceSopenharmony_ci sd_event_add_time(sd_loop, &sd_timer, CLOCK_MONOTONIC, now, 58d4afb5ceSopenharmony_ci (uint64_t) 1000, timer_cb_sd, NULL); 59d4afb5ceSopenharmony_ci 60d4afb5ceSopenharmony_ci sd_event_loop(sd_loop); 61d4afb5ceSopenharmony_ci} 62d4afb5ceSopenharmony_ci 63d4afb5ceSopenharmony_cistatic void 64d4afb5ceSopenharmony_ciforeign_event_loop_stop_libsdevent(void) 65d4afb5ceSopenharmony_ci{ 66d4afb5ceSopenharmony_ci sd_event_exit(sd_loop, 0); 67d4afb5ceSopenharmony_ci} 68d4afb5ceSopenharmony_ci 69d4afb5ceSopenharmony_cistatic void 70d4afb5ceSopenharmony_ciforeign_event_loop_cleanup_libsdevent(void) 71d4afb5ceSopenharmony_ci{ 72d4afb5ceSopenharmony_ci sd_event_source_set_enabled(sd_timer, SD_EVENT_OFF); 73d4afb5ceSopenharmony_ci sd_timer = sd_event_source_unref(sd_timer); 74d4afb5ceSopenharmony_ci 75d4afb5ceSopenharmony_ci sd_event_source_set_enabled(sd_signal, SD_EVENT_OFF); 76d4afb5ceSopenharmony_ci sd_signal = sd_event_source_unref(sd_signal); 77d4afb5ceSopenharmony_ci 78d4afb5ceSopenharmony_ci sd_loop = sd_event_unref(sd_loop); 79d4afb5ceSopenharmony_ci} 80d4afb5ceSopenharmony_ci 81d4afb5ceSopenharmony_ciconst struct ops ops_sdevent = { 82d4afb5ceSopenharmony_ci foreign_event_loop_init_and_run_libsdevent, 83d4afb5ceSopenharmony_ci foreign_event_loop_stop_libsdevent, 84d4afb5ceSopenharmony_ci foreign_event_loop_cleanup_libsdevent 85d4afb5ceSopenharmony_ci}; 86d4afb5ceSopenharmony_ci 87