diff options
Diffstat (limited to 'libmapper/mapper.c')
-rw-r--r-- | libmapper/mapper.c | 69 |
1 files changed, 47 insertions, 22 deletions
diff --git a/libmapper/mapper.c b/libmapper/mapper.c index 962b4e0..ad64d4a 100644 --- a/libmapper/mapper.c +++ b/libmapper/mapper.c @@ -35,6 +35,11 @@ static const char *async_wait_interfaces_added_match = "interface='org.freedesktop.DBus.ObjectManager'," "member='InterfacesAdded'"; +static const char *async_wait_interfaces_removed_match = + "type='signal'," + "interface='org.freedesktop.DBus.ObjectManager'," + "member='InterfacesRemoved'"; + static const int mapper_busy_retries = 5; static const uint64_t mapper_busy_delay_interval_usec = 1000000; @@ -51,6 +56,7 @@ struct mapper_async_wait int count; int finished; int r; + bool added; }; struct async_wait_callback_data @@ -157,8 +163,12 @@ static int async_wait_getobject_callback(sd_bus_message *m, goto exit; r = sd_bus_message_get_errno(m); - if(r == ENOENT) - goto exit; + if(r == ENOENT) { + if (wait->added) + goto exit; + else + r = 0; + } if(r == EBUSY && data->retry < mapper_busy_retries) { r = sd_event_now(wait->loop, @@ -296,7 +306,8 @@ int mapper_wait_async(sd_bus *conn, char *objs[], void (*callback)(int, void *), void *userdata, - mapper_async_wait **w) + mapper_async_wait **w, + bool added) { int r; mapper_async_wait *wait = NULL; @@ -313,6 +324,7 @@ int mapper_wait_async(sd_bus *conn, wait->count = sarraylen(objs); if(!wait->count) return 0; + wait->added = added; wait->objs = sarraydup(objs); if(!wait->objs) { @@ -327,26 +339,39 @@ int mapper_wait_async(sd_bus *conn, } memset(wait->status, 0, sizeof(*wait->status) * wait->count); - r = sd_bus_add_match(conn, - &wait->introspection_slot, - async_wait_introspection_match, - async_wait_match_introspection_complete, - wait); - if(r < 0) { - fprintf(stderr, "Error adding match rule: %s\n", - strerror(-r)); - goto free_status; - } + if (wait->added) { + r = sd_bus_add_match(conn, + &wait->introspection_slot, + async_wait_introspection_match, + async_wait_match_introspection_complete, + wait); + if(r < 0) { + fprintf(stderr, "Error adding match rule: %s\n", + strerror(-r)); + goto free_status; + } - r = sd_bus_add_match(conn, - &wait->intf_slot, - async_wait_interfaces_added_match, - async_wait_match_introspection_complete, - wait); - if(r < 0) { - fprintf(stderr, "Error adding match rule: %s\n", - strerror(-r)); - goto unref_name_slot; + r = sd_bus_add_match(conn, + &wait->intf_slot, + async_wait_interfaces_added_match, + async_wait_match_introspection_complete, + wait); + if(r < 0) { + fprintf(stderr, "Error adding match rule: %s\n", + strerror(-r)); + goto unref_name_slot; + } + } else { + r = sd_bus_add_match(conn, + &wait->intf_slot, + async_wait_interfaces_removed_match, + async_wait_match_introspection_complete, + wait); + if(r < 0) { + fprintf(stderr, "Error adding match rule: %s\n", + strerror(-r)); + goto unref_name_slot; + } } r = async_wait_get_objects(wait); |