mirror of
https://github.com/libratbag/libratbag.git
synced 2026-11-07 23:23:52 +01:00
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:
@@ -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));
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user