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 <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer
2018-11-26 14:24:49 +10:00
parent 45b8d792cc
commit e9bb4f98ae
3 changed files with 51 additions and 8 deletions

View File

@@ -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));

View File

@@ -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);
}

View File

@@ -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);