binding: use afb_api_queue_job to queue events to run async 93/21793/1 7.99.2 7.99.3 halibut/7.99.2 halibut/7.99.3 halibut_7.99.2 halibut_7.99.3
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>
Fri, 28 Jun 2019 14:32:20 +0000 (17:32 +0300)
committerGeorge Kiagiadakis <george.kiagiadakis@collabora.com>
Fri, 28 Jun 2019 14:32:20 +0000 (17:32 +0300)
Apparently the binder does not like manual interventions to the
event loop and it has its own mechanism for queueing events
to run asynchronously.

Signed-off-by: George Kiagiadakis <george.kiagiadakis@collabora.com>
Change-Id: Iefef031b4ad8932bbf36a5213a119908de48b41f

binding/audiomixer-binding.c

index 005f5c7..652df0a 100644 (file)
@@ -15,31 +15,28 @@ static struct audiomixer *audiomixer;
 static afb_event_t controls_changed;
 static afb_event_t volume_changed;
 static afb_event_t mute_changed;
-static sd_event_source *controls_changed_source;
 
-static int
-audiomixer_controls_changed_deferred(sd_event_source *s, void *data)
+static void
+audiomixer_controls_changed_deferred(int signum, void *arg)
 {
+       AFB_DEBUG("controls changed");
        afb_event_push(controls_changed, NULL);
-
-       sd_event_source_unref(controls_changed_source);
-       controls_changed_source = NULL;
-       return 0;
 }
 
 struct value_changed_data
 {
        unsigned int change_mask;
        struct mixer_control control;
-       sd_event_source *source;
 };
 
-static int
-audiomixer_value_changed_deferred(sd_event_source *s, void *data)
+static void
+audiomixer_value_changed_deferred(int signum, void *data)
 {
        struct value_changed_data *d = data;
        json_object *json;
 
+       AFB_DEBUG("value changed");
+
        json = json_object_new_object();
        json_object_object_add(json, "control",
                json_object_new_string(d->control.name));
@@ -54,18 +51,16 @@ audiomixer_value_changed_deferred(sd_event_source *s, void *data)
                afb_event_push(mute_changed, json);
        }
 
-       sd_event_source_unref(d->source);
        free(d);
-       return 0;
 }
 
 /* called in audiomixer's thread */
 static void
 audiomixer_controls_changed(void *data)
 {
-       sd_event *e = afb_daemon_get_event_loop();
-       sd_event_add_defer(e, &controls_changed_source,
-               audiomixer_controls_changed_deferred, NULL);
+       afb_api_t api = data;
+       afb_api_queue_job (api, audiomixer_controls_changed_deferred, NULL,
+               (void *) 0x1, 0);
 }
 
 
@@ -75,15 +70,14 @@ audiomixer_value_changed(void *data,
        unsigned int change_mask,
        const struct mixer_control *control)
 {
-       sd_event *e = afb_daemon_get_event_loop();
+       afb_api_t api = data;
        struct value_changed_data *d = calloc(1, sizeof(*d));
 
        d->change_mask = change_mask;
        d->control = *control;
 
-       if (sd_event_add_defer(e, &d->source,
-                       audiomixer_value_changed_deferred, d) < 0)
-               free(d);
+       afb_api_queue_job (api, audiomixer_value_changed_deferred, d,
+               (void *) 0x1, 0);
 }
 
 static const struct audiomixer_events audiomixer_events = {
@@ -111,7 +105,7 @@ init(afb_api_t api)
        audiomixer = audiomixer_new();
        sd_event_add_exit(e, NULL, cleanup, NULL);
 
-       audiomixer_add_event_listener(audiomixer, &audiomixer_events, NULL);
+       audiomixer_add_event_listener(audiomixer, &audiomixer_events, api);
 
        return 0;
 }