From e9bb4f98aecc74c7a0dc64ae4172cada342bb354 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 26 Nov 2018 14:24:49 +1000 Subject: [PATCH] ratbagd: make Commit() truly asynchronous Schedule the actual operation as a callback to handle at the end of the event loop and return success. The Resync signal will handle the rest. Signed-off-by: Peter Hutterer --- ratbagd/ratbagd-device.c | 21 +++++++++++++-------- ratbagd/ratbagd.c | 32 ++++++++++++++++++++++++++++++++ ratbagd/ratbagd.h | 6 ++++++ 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/ratbagd/ratbagd-device.c b/ratbagd/ratbagd-device.c index 74761065..d69611f6 100644 --- a/ratbagd/ratbagd-device.c +++ b/ratbagd/ratbagd-device.c @@ -256,20 +256,25 @@ static int ratbagd_device_get_profiles(sd_bus *bus, return 0; } +static void ratbagd_device_commit_pending(void *data) +{ + struct ratbagd_device *device = data; + int r; + + r = ratbag_device_commit(device->lib_device); + if (r < 0) + ratbagd_device_resync(device, device->ctx->bus); +} + static int ratbagd_device_commit(sd_bus_message *m, void *userdata, sd_bus_error *error) { struct ratbagd_device *device = userdata; - int r; - r = ratbag_device_commit(device->lib_device); - if (r < 0) { - sd_bus *bus = sd_bus_message_get_bus(m); - r = ratbagd_device_resync(device, bus); - if (r < 0) - return r; - } + ratbagd_schedule_task(device->ctx, + ratbagd_device_commit_pending, + device); CHECK_CALL(sd_bus_reply_method_return(m, "u", 0)); diff --git a/ratbagd/ratbagd.c b/ratbagd/ratbagd.c index 61a83303..7729d6af 100644 --- a/ratbagd/ratbagd.c +++ b/ratbagd/ratbagd.c @@ -605,3 +605,35 @@ exit: return EXIT_SUCCESS; } + +struct ratbagd_callback +{ + ratbagd_callback_t callback; + void *userdata; +}; + +static int ratbagd_callback_handler(sd_event_source *s, void *userdata) +{ + struct ratbagd_callback *cb = userdata; + + cb->callback(cb->userdata); + + sd_event_source_set_enabled(s, SD_EVENT_OFF); + sd_event_source_unref(s); + free(cb); + + return 0; +} + +void ratbagd_schedule_task(struct ratbagd *ctx, + ratbagd_callback_t callback, + void *userdata) +{ + struct ratbagd_callback *cb = zalloc(sizeof *cb); + sd_event_source *source; + + cb->callback = callback; + cb->userdata = userdata; + + sd_event_add_post(ctx->event, &source, ratbagd_callback_handler, cb); +} diff --git a/ratbagd/ratbagd.h b/ratbagd/ratbagd.h index 5c91e2eb..ff1656cc 100644 --- a/ratbagd/ratbagd.h +++ b/ratbagd/ratbagd.h @@ -217,3 +217,9 @@ struct ratbagd { const char **themes; /* NULL-terminated */ }; + +typedef void (*ratbagd_callback_t)(void *userdata); + +void ratbagd_schedule_task(struct ratbagd *ctx, + ratbagd_callback_t callback, + void *userdata);