tree-wide: install matches asynchronously
Let's remove a number of synchronization points from our service startups: let's drop synchronous match installation, and let's opt for asynchronous instead. Also, let's use sd_bus_match_signal() instead of sd_bus_add_match() where we can.
This commit is contained in:
parent
0c0b930647
commit
75152a4d6a
|
@ -604,18 +604,16 @@ static int bus_setup_disconnected_match(Manager *m, sd_bus *bus) {
|
|||
assert(m);
|
||||
assert(bus);
|
||||
|
||||
r = sd_bus_add_match(
|
||||
r = sd_bus_match_signal_async(
|
||||
bus,
|
||||
NULL,
|
||||
"sender='org.freedesktop.DBus.Local',"
|
||||
"type='signal',"
|
||||
"path='/org/freedesktop/DBus/Local',"
|
||||
"interface='org.freedesktop.DBus.Local',"
|
||||
"member='Disconnected'",
|
||||
signal_disconnected, m);
|
||||
|
||||
"org.freedesktop.DBus.Local",
|
||||
"/org/freedesktop/DBus/Local",
|
||||
"org.freedesktop.DBus.Local",
|
||||
"Disconnected",
|
||||
signal_disconnected, NULL, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to register match for Disconnected message: %m");
|
||||
return log_error_errno(r, "Failed to request match for Disconnected message: %m");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -814,15 +812,14 @@ static int bus_setup_api(Manager *m, sd_bus *bus) {
|
|||
log_error_errno(r, "Failed to subscribe to NameOwnerChanged signal for '%s': %m", name);
|
||||
}
|
||||
|
||||
r = sd_bus_add_match(
|
||||
r = sd_bus_match_signal_async(
|
||||
bus,
|
||||
NULL,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.DBus',"
|
||||
"path='/org/freedesktop/DBus',"
|
||||
"interface='org.freedesktop.systemd1.Activator',"
|
||||
"member='ActivationRequest'",
|
||||
signal_activation_request, m);
|
||||
"org.freedesktop.DBus",
|
||||
"/org/freedesktop/DBus",
|
||||
"org.freedesktop.systemd1.Activator",
|
||||
"ActivationRequest",
|
||||
signal_activation_request, NULL, m);
|
||||
if (r < 0)
|
||||
log_warning_errno(r, "Failed to subscribe to activation signal: %m");
|
||||
|
||||
|
@ -856,7 +853,6 @@ static int bus_init_api(Manager *m) {
|
|||
r = sd_bus_open_system(&bus);
|
||||
else
|
||||
r = sd_bus_open_user(&bus);
|
||||
|
||||
if (r < 0) {
|
||||
log_debug("Failed to connect to API bus, retrying later...");
|
||||
return 0;
|
||||
|
@ -893,16 +889,16 @@ static int bus_setup_system(Manager *m, sd_bus *bus) {
|
|||
|
||||
/* if we are a user instance we get the Released message via the system bus */
|
||||
if (MANAGER_IS_USER(m)) {
|
||||
r = sd_bus_add_match(
|
||||
r = sd_bus_match_signal_async(
|
||||
bus,
|
||||
NULL,
|
||||
"type='signal',"
|
||||
"interface='org.freedesktop.systemd1.Agent',"
|
||||
"member='Released',"
|
||||
"path='/org/freedesktop/systemd1/agent'",
|
||||
signal_agent_released, m);
|
||||
NULL,
|
||||
"/org/freedesktop/systemd1/agent",
|
||||
"org.freedesktop.systemd1.Agent",
|
||||
"Released",
|
||||
signal_agent_released, NULL, m);
|
||||
if (r < 0)
|
||||
log_warning_errno(r, "Failed to register Released match on system bus: %m");
|
||||
log_warning_errno(r, "Failed to request Released match on system bus: %m");
|
||||
}
|
||||
|
||||
log_debug("Successfully connected to system bus.");
|
||||
|
|
|
@ -3042,7 +3042,7 @@ int unit_install_bus_match(Unit *u, sd_bus *bus, const char *name) {
|
|||
"member='NameOwnerChanged',"
|
||||
"arg0='", name, "'");
|
||||
|
||||
return sd_bus_add_match(bus, &u->match_bus_slot, match, signal_name_owner_changed, u);
|
||||
return sd_bus_add_match_async(bus, &u->match_bus_slot, match, signal_name_owner_changed, NULL, u);
|
||||
}
|
||||
|
||||
int unit_watch_bus_name(Unit *u, const char *name) {
|
||||
|
|
|
@ -259,9 +259,7 @@ _public_ int sd_bus_track_add_name(sd_bus_track *track, const char *name) {
|
|||
|
||||
bus_track_remove_from_queue(track); /* don't dispatch this while we work in it */
|
||||
|
||||
track->n_adding++; /* make sure we aren't dispatched while we synchronously add this match */
|
||||
r = sd_bus_add_match(track->bus, &n->slot, match, on_name_owner_changed, track);
|
||||
track->n_adding--;
|
||||
r = sd_bus_add_match_async(track->bus, &n->slot, match, on_name_owner_changed, NULL, track);
|
||||
if (r < 0) {
|
||||
bus_track_add_to_queue(track);
|
||||
return r;
|
||||
|
|
|
@ -102,9 +102,9 @@ static int server_init(sd_bus **_bus) {
|
|||
goto fail;
|
||||
}
|
||||
|
||||
r = sd_bus_add_match(bus, NULL, "type='signal',interface='foo.bar',member='Notify'", match_callback, NULL);
|
||||
r = sd_bus_match_signal(bus, NULL, NULL, NULL, "foo.bar", "Notify", match_callback, NULL);
|
||||
if (r < 0) {
|
||||
log_error_errno(r, "Failed to add match: %m");
|
||||
log_error_errno(r, "Failed to request match: %m");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
|
|
@ -696,48 +696,49 @@ static int manager_connect_bus(Manager *m) {
|
|||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add user enumerator: %m");
|
||||
|
||||
r = sd_bus_add_match(m->bus,
|
||||
NULL,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.systemd1',"
|
||||
"interface='org.freedesktop.systemd1.Manager',"
|
||||
"member='JobRemoved',"
|
||||
"path='/org/freedesktop/systemd1'",
|
||||
match_job_removed, m);
|
||||
r = sd_bus_match_signal_async(
|
||||
m->bus,
|
||||
NULL,
|
||||
"org.freedesktop.systemd1",
|
||||
"/org/freedesktop/systemd1",
|
||||
"org.freedesktop.systemd1.Manager",
|
||||
"JobRemoved",
|
||||
match_job_removed, NULL, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match for JobRemoved: %m");
|
||||
return log_error_errno(r, "Failed to request match for JobRemoved: %m");
|
||||
|
||||
r = sd_bus_add_match(m->bus,
|
||||
NULL,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.systemd1',"
|
||||
"interface='org.freedesktop.systemd1.Manager',"
|
||||
"member='UnitRemoved',"
|
||||
"path='/org/freedesktop/systemd1'",
|
||||
match_unit_removed, m);
|
||||
r = sd_bus_match_signal_async(
|
||||
m->bus,
|
||||
NULL,
|
||||
"org.freedesktop.systemd1",
|
||||
"/org/freedesktop/systemd1",
|
||||
"org.freedesktop.systemd1.Manager",
|
||||
"UnitRemoved",
|
||||
match_unit_removed, NULL, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match for UnitRemoved: %m");
|
||||
return log_error_errno(r, "Failed to request match for UnitRemoved: %m");
|
||||
|
||||
r = sd_bus_add_match(m->bus,
|
||||
NULL,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.systemd1',"
|
||||
"interface='org.freedesktop.DBus.Properties',"
|
||||
"member='PropertiesChanged'",
|
||||
match_properties_changed, m);
|
||||
r = sd_bus_match_signal_async(
|
||||
m->bus,
|
||||
NULL,
|
||||
"org.freedesktop.systemd1",
|
||||
NULL,
|
||||
"org.freedesktop.DBus.Properties",
|
||||
"PropertiesChanged",
|
||||
match_properties_changed, NULL, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match for PropertiesChanged: %m");
|
||||
return log_error_errno(r, "Failed to request match for PropertiesChanged: %m");
|
||||
|
||||
r = sd_bus_add_match(m->bus,
|
||||
NULL,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.systemd1',"
|
||||
"interface='org.freedesktop.systemd1.Manager',"
|
||||
"member='Reloading',"
|
||||
"path='/org/freedesktop/systemd1'",
|
||||
match_reloading, m);
|
||||
r = sd_bus_match_signal_async(
|
||||
m->bus,
|
||||
NULL,
|
||||
"org.freedesktop.systemd1",
|
||||
"/org/freedesktop/systemd1",
|
||||
"org.freedesktop.systemd1.Manager",
|
||||
"Reloading",
|
||||
match_reloading, NULL, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match for Reloading: %m");
|
||||
return log_error_errno(r, "Failed to request match for Reloading: %m");
|
||||
|
||||
r = sd_bus_call_method(
|
||||
m->bus,
|
||||
|
|
|
@ -1568,9 +1568,9 @@ static int login_machine(int argc, char *argv[], void *userdata) {
|
|||
"member='MachineRemoved',"
|
||||
"arg0='", machine, "'");
|
||||
|
||||
r = sd_bus_add_match(bus, &slot, match, on_machine_removed, &forward);
|
||||
r = sd_bus_add_match_async(bus, &slot, match, on_machine_removed, NULL, &forward);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add machine removal match: %m");
|
||||
return log_error_errno(r, "Failed to request machine removal match: %m");
|
||||
|
||||
r = sd_bus_call_method(
|
||||
bus,
|
||||
|
@ -1643,9 +1643,9 @@ static int shell_machine(int argc, char *argv[], void *userdata) {
|
|||
"member='MachineRemoved',"
|
||||
"arg0='", machine, "'");
|
||||
|
||||
r = sd_bus_add_match(bus, &slot, match, on_machine_removed, &forward);
|
||||
r = sd_bus_add_match_async(bus, &slot, match, on_machine_removed, NULL, &forward);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add machine removal match: %m");
|
||||
return log_error_errno(r, "Failed to request machine removal match: %m");
|
||||
|
||||
r = sd_bus_message_new_method_call(
|
||||
bus,
|
||||
|
@ -2087,28 +2087,27 @@ static int transfer_image_common(sd_bus *bus, sd_bus_message *m) {
|
|||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to attach bus to event loop: %m");
|
||||
|
||||
r = sd_bus_add_match(
|
||||
r = sd_bus_match_signal_async(
|
||||
bus,
|
||||
&slot_job_removed,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.import1',"
|
||||
"interface='org.freedesktop.import1.Manager',"
|
||||
"member='TransferRemoved',"
|
||||
"path='/org/freedesktop/import1'",
|
||||
match_transfer_removed, &path);
|
||||
"org.freedesktop.import1",
|
||||
"/org/freedesktop/import1",
|
||||
"org.freedesktop.import1.Manager",
|
||||
"TransferRemoved",
|
||||
match_transfer_removed, NULL, &path);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to install match: %m");
|
||||
return log_error_errno(r, "Failed to request match: %m");
|
||||
|
||||
r = sd_bus_add_match(
|
||||
r = sd_bus_match_signal_async(
|
||||
bus,
|
||||
&slot_log_message,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.import1',"
|
||||
"interface='org.freedesktop.import1.Transfer',"
|
||||
"member='LogMessage'",
|
||||
match_log_message, &path);
|
||||
"org.freedesktop.import1",
|
||||
NULL,
|
||||
"org.freedesktop.import1.Transfer",
|
||||
"LogMessage",
|
||||
match_log_message, NULL, &path);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to install match: %m");
|
||||
return log_error_errno(r, "Failed to request match: %m");
|
||||
|
||||
r = sd_bus_call(bus, m, 0, &error, &reply);
|
||||
if (r < 0) {
|
||||
|
|
|
@ -216,53 +216,49 @@ static int manager_connect_bus(Manager *m) {
|
|||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add image enumerator: %m");
|
||||
|
||||
r = sd_bus_add_match(m->bus,
|
||||
NULL,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.systemd1',"
|
||||
"interface='org.freedesktop.systemd1.Manager',"
|
||||
"member='JobRemoved',"
|
||||
"path='/org/freedesktop/systemd1'",
|
||||
match_job_removed,
|
||||
m);
|
||||
r = sd_bus_match_signal_async(
|
||||
m->bus,
|
||||
NULL,
|
||||
"org.freedesktop.systemd1",
|
||||
"/org/freedesktop/systemd1",
|
||||
"org.freedesktop.systemd1.Manager",
|
||||
"JobRemoved",
|
||||
match_job_removed, NULL, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match for JobRemoved: %m");
|
||||
|
||||
r = sd_bus_add_match(m->bus,
|
||||
NULL,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.systemd1',"
|
||||
"interface='org.freedesktop.systemd1.Manager',"
|
||||
"member='UnitRemoved',"
|
||||
"path='/org/freedesktop/systemd1'",
|
||||
match_unit_removed,
|
||||
m);
|
||||
r = sd_bus_match_signal_async(
|
||||
m->bus,
|
||||
NULL,
|
||||
"org.freedesktop.systemd1",
|
||||
"/org/freedesktop/systemd1",
|
||||
"org.freedesktop.systemd1.Manager",
|
||||
"UnitRemoved",
|
||||
match_unit_removed, NULL, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match for UnitRemoved: %m");
|
||||
return log_error_errno(r, "Failed to request match for UnitRemoved: %m");
|
||||
|
||||
r = sd_bus_add_match(m->bus,
|
||||
NULL,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.systemd1',"
|
||||
"interface='org.freedesktop.DBus.Properties',"
|
||||
"member='PropertiesChanged',"
|
||||
"arg0='org.freedesktop.systemd1.Unit'",
|
||||
match_properties_changed,
|
||||
m);
|
||||
r = sd_bus_match_signal_async(
|
||||
m->bus,
|
||||
NULL,
|
||||
"org.freedesktop.systemd1",
|
||||
NULL,
|
||||
"org.freedesktop.DBus.Properties",
|
||||
"PropertiesChanged",
|
||||
match_properties_changed, NULL, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match for PropertiesChanged: %m");
|
||||
return log_error_errno(r, "Failed to request match for PropertiesChanged: %m");
|
||||
|
||||
r = sd_bus_add_match(m->bus,
|
||||
NULL,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.systemd1',"
|
||||
"interface='org.freedesktop.systemd1.Manager',"
|
||||
"member='Reloading',"
|
||||
"path='/org/freedesktop/systemd1'",
|
||||
match_reloading,
|
||||
m);
|
||||
r = sd_bus_match_signal_async(
|
||||
m->bus,
|
||||
NULL,
|
||||
"org.freedesktop.systemd1",
|
||||
"/org/freedesktop/systemd1",
|
||||
"org.freedesktop.systemd1.Manager",
|
||||
"Reloading",
|
||||
match_reloading, NULL, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match for Reloading: %m");
|
||||
return log_error_errno(r, "Failed to request match for Reloading: %m");
|
||||
|
||||
r = sd_bus_call_method(
|
||||
m->bus,
|
||||
|
|
|
@ -152,16 +152,15 @@ int manager_connect_bus(Manager *m) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
r = sd_bus_add_match(m->bus, &m->prepare_for_sleep_slot,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.login1',"
|
||||
"interface='org.freedesktop.login1.Manager',"
|
||||
"member='PrepareForSleep',"
|
||||
"path='/org/freedesktop/login1'",
|
||||
match_prepare_for_sleep,
|
||||
m);
|
||||
r = sd_bus_match_signal_async(
|
||||
m->bus, &m->prepare_for_sleep_slot,
|
||||
"org.freedesktop.login1",
|
||||
"/org/freedesktop/login1",
|
||||
"org.freedesktop.login1.Manager",
|
||||
"PrepareForSleep",
|
||||
match_prepare_for_sleep, NULL, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match for PrepareForSleep: %m");
|
||||
return log_error_errno(r, "Failed to request match for PrepareForSleep: %m");
|
||||
|
||||
r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/network1", "org.freedesktop.network1.Manager", manager_vtable, m);
|
||||
if (r < 0)
|
||||
|
|
|
@ -3622,14 +3622,16 @@ static int run(int master,
|
|||
* case PID 1 will send us a friendly RequestStop signal, when it is asked to terminate the
|
||||
* scope. Let's hook into that, and cleanly shut down the container, and print a friendly message. */
|
||||
|
||||
r = sd_bus_add_match(bus, NULL,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.systemd1',"
|
||||
"interface='org.freedesktop.systemd1.Scope',"
|
||||
"member='RequestStop'",
|
||||
on_request_stop, PID_TO_PTR(*pid));
|
||||
r = sd_bus_match_signal_async(
|
||||
bus,
|
||||
NULL,
|
||||
"org.freedesktop.systemd1",
|
||||
NULL,
|
||||
"org.freedesktop.systemd1.Scope",
|
||||
"RequestStop",
|
||||
on_request_stop, NULL, PID_TO_PTR(*pid));
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to install request stop match: %m");
|
||||
return log_error_errno(r, "Failed to request RequestStop match: %m");
|
||||
}
|
||||
|
||||
if (arg_register) {
|
||||
|
|
|
@ -1929,16 +1929,18 @@ int manager_connect_bus(Manager *m) {
|
|||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to attach bus to event loop: %m");
|
||||
|
||||
r = sd_bus_add_match(m->bus, &m->prepare_for_sleep_slot,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.login1',"
|
||||
"interface='org.freedesktop.login1.Manager',"
|
||||
"member='PrepareForSleep',"
|
||||
"path='/org/freedesktop/login1'",
|
||||
match_prepare_for_sleep,
|
||||
m);
|
||||
r = sd_bus_match_signal_async(
|
||||
m->bus,
|
||||
&m->prepare_for_sleep_slot,
|
||||
"org.freedesktop.login1",
|
||||
"/org/freedesktop/login1",
|
||||
"org.freedesktop.login1.Manager",
|
||||
"PrepareForSleep",
|
||||
match_prepare_for_sleep,
|
||||
NULL,
|
||||
m);
|
||||
if (r < 0)
|
||||
log_error_errno(r, "Failed to add match for PrepareForSleep: %m");
|
||||
log_error_errno(r, "Failed to request match for PrepareForSleep: %m");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1059,7 +1059,6 @@ static int start_transient_service(
|
|||
.inactive_enter_usec = USEC_INFINITY,
|
||||
};
|
||||
_cleanup_free_ char *path = NULL;
|
||||
const char *mt;
|
||||
|
||||
c.bus = sd_bus_ref(bus);
|
||||
|
||||
|
@ -1089,18 +1088,20 @@ static int start_transient_service(
|
|||
if (!path)
|
||||
return log_oom();
|
||||
|
||||
mt = strjoina("type='signal',"
|
||||
"sender='org.freedesktop.systemd1',"
|
||||
"path='", path, "',"
|
||||
"interface='org.freedesktop.DBus.Properties',"
|
||||
"member='PropertiesChanged'");
|
||||
r = sd_bus_add_match(bus, &c.match, mt, on_properties_changed, &c);
|
||||
r = sd_bus_match_signal_async(
|
||||
bus,
|
||||
&c.match,
|
||||
"org.freedesktop.systemd1",
|
||||
path,
|
||||
"org.freedesktop.DBus.Properties",
|
||||
"PropertiesChanged",
|
||||
on_properties_changed, NULL, &c);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add properties changed signal.");
|
||||
return log_error_errno(r, "Failed to request properties changed signal match: %m");
|
||||
|
||||
r = sd_bus_attach_event(bus, c.event, SD_EVENT_PRIORITY_NORMAL);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to attach bus to event loop.");
|
||||
return log_error_errno(r, "Failed to attach bus to event loop: %m");
|
||||
|
||||
r = run_context_update(&c, path);
|
||||
if (r < 0)
|
||||
|
|
|
@ -1730,31 +1730,25 @@ int bus_wait_for_jobs_new(sd_bus *bus, BusWaitForJobs **ret) {
|
|||
/* When we are a bus client we match by sender. Direct
|
||||
* connections OTOH have no initialized sender field, and
|
||||
* hence we ignore the sender then */
|
||||
r = sd_bus_add_match(
|
||||
r = sd_bus_match_signal_async(
|
||||
bus,
|
||||
&d->slot_job_removed,
|
||||
bus->bus_client ?
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.systemd1',"
|
||||
"interface='org.freedesktop.systemd1.Manager',"
|
||||
"member='JobRemoved',"
|
||||
"path='/org/freedesktop/systemd1'" :
|
||||
"type='signal',"
|
||||
"interface='org.freedesktop.systemd1.Manager',"
|
||||
"member='JobRemoved',"
|
||||
"path='/org/freedesktop/systemd1'",
|
||||
match_job_removed, d);
|
||||
bus->bus_client ? "org.freedesktop.systemd1" : NULL,
|
||||
"/org/freedesktop/systemd1",
|
||||
"org.freedesktop.systemd1.Manager",
|
||||
"JobRemoved",
|
||||
match_job_removed, NULL, d);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_add_match(
|
||||
r = sd_bus_match_signal_async(
|
||||
bus,
|
||||
&d->slot_disconnected,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.DBus.Local',"
|
||||
"interface='org.freedesktop.DBus.Local',"
|
||||
"member='Disconnected'",
|
||||
match_disconnected, d);
|
||||
"org.freedesktop.DBus.Local",
|
||||
NULL,
|
||||
"org.freedesktop.DBus.Local",
|
||||
"Disconnected",
|
||||
match_disconnected, NULL, d);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ static int name_owner_change_callback(sd_bus_message *m, void *userdata, sd_bus_
|
|||
}
|
||||
|
||||
int bus_async_unregister_and_exit(sd_event *e, sd_bus *bus, const char *name) {
|
||||
_cleanup_free_ char *match = NULL;
|
||||
const char *match;
|
||||
const char *unique;
|
||||
int r;
|
||||
|
||||
|
@ -85,23 +85,21 @@ int bus_async_unregister_and_exit(sd_event *e, sd_bus *bus, const char *name) {
|
|||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = asprintf(&match,
|
||||
"sender='org.freedesktop.DBus',"
|
||||
"type='signal',"
|
||||
"interface='org.freedesktop.DBus',"
|
||||
"member='NameOwnerChanged',"
|
||||
"path='/org/freedesktop/DBus',"
|
||||
"arg0='%s',"
|
||||
"arg1='%s',"
|
||||
"arg2=''", name, unique);
|
||||
if (r < 0)
|
||||
return -ENOMEM;
|
||||
match = strjoina(
|
||||
"sender='org.freedesktop.DBus',"
|
||||
"type='signal',"
|
||||
"interface='org.freedesktop.DBus',"
|
||||
"member='NameOwnerChanged',"
|
||||
"path='/org/freedesktop/DBus',"
|
||||
"arg0='", name, "',",
|
||||
"arg1='", unique, "',",
|
||||
"arg2=''");
|
||||
|
||||
r = sd_bus_add_match(bus, NULL, match, name_owner_change_callback, e);
|
||||
r = sd_bus_add_match_async(bus, NULL, match, name_owner_change_callback, NULL, e);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_release_name(bus, name);
|
||||
r = sd_bus_release_name_async(bus, NULL, name, NULL, NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
|
|
@ -2905,7 +2905,6 @@ static int start_unit_one(
|
|||
|
||||
if (wait_context) {
|
||||
_cleanup_free_ char *unit_path = NULL;
|
||||
const char* mt;
|
||||
|
||||
log_debug("Watching for property changes of %s", name);
|
||||
r = sd_bus_call_method(
|
||||
|
@ -2928,13 +2927,15 @@ static int start_unit_one(
|
|||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add unit path %s to set: %m", unit_path);
|
||||
|
||||
mt = strjoina("type='signal',"
|
||||
"interface='org.freedesktop.DBus.Properties',"
|
||||
"path='", unit_path, "',"
|
||||
"member='PropertiesChanged'");
|
||||
r = sd_bus_add_match(bus, &wait_context->match, mt, on_properties_changed, wait_context);
|
||||
r = sd_bus_match_signal_async(bus,
|
||||
&wait_context->match,
|
||||
NULL,
|
||||
unit_path,
|
||||
"org.freedesktop.DBus.Properties",
|
||||
"PropertiesChanged",
|
||||
on_properties_changed, NULL, wait_context);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match for PropertiesChanged signal: %m");
|
||||
return log_error_errno(r, "Failed to request match for PropertiesChanged signal: %m");
|
||||
}
|
||||
|
||||
log_debug("%s manager for %s on %s, %s",
|
||||
|
|
Loading…
Reference in a new issue