blob: 4baa12c5e86bb22b4a9a671877e919954b3f1356 [file] [log] [blame]
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +01001/* SPDX-License-Identifier: MIT */
2/* Copyright 2014 Tom Gundersen */
Tom Gundersenc609cb92014-08-27 19:04:29 +02003
Tom Gundersenc609cb92014-08-27 19:04:29 +02004#include <stdlib.h>
5
Tom Gundersenc609cb92014-08-27 19:04:29 +02006typedef struct SDEventSource {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +01007 GSource source;
8 GPollFD pollfd;
9 sd_event *event;
Tom Gundersenc609cb92014-08-27 19:04:29 +020010} SDEventSource;
11
12static gboolean event_prepare(GSource *source, gint *timeout_) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010013 return sd_event_prepare(((SDEventSource *)source)->event) > 0;
Tom Gundersenc609cb92014-08-27 19:04:29 +020014}
15
16static gboolean event_check(GSource *source) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010017 return sd_event_wait(((SDEventSource *)source)->event, 0) > 0;
Tom Gundersenc609cb92014-08-27 19:04:29 +020018}
19
20static gboolean event_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010021 return sd_event_dispatch(((SDEventSource *)source)->event) > 0;
Tom Gundersenc609cb92014-08-27 19:04:29 +020022}
23
24static void event_finalize(GSource *source) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010025 sd_event_unref(((SDEventSource *)source)->event);
Tom Gundersenc609cb92014-08-27 19:04:29 +020026}
27
28static GSourceFuncs event_funcs = {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010029 .prepare = event_prepare,
30 .check = event_check,
31 .dispatch = event_dispatch,
32 .finalize = event_finalize,
Tom Gundersenc609cb92014-08-27 19:04:29 +020033};
34
35GSource *g_sd_event_create_source(sd_event *event) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010036 SDEventSource *source;
Tom Gundersenc609cb92014-08-27 19:04:29 +020037
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010038 source = (SDEventSource *)g_source_new(&event_funcs, sizeof(SDEventSource));
Tom Gundersenc609cb92014-08-27 19:04:29 +020039
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010040 source->event = sd_event_ref(event);
41 source->pollfd.fd = sd_event_get_fd(event);
42 source->pollfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR;
Tom Gundersenc609cb92014-08-27 19:04:29 +020043
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010044 g_source_add_poll((GSource *)source, &source->pollfd);
Tom Gundersenc609cb92014-08-27 19:04:29 +020045
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010046 return (GSource *)source;
Tom Gundersenc609cb92014-08-27 19:04:29 +020047}