summaryrefslogtreecommitdiff
path: root/src/core/unit.h
diff options
context:
space:
mode:
authorDaniel Mack <daniel@zonque.org>2015-08-05 17:47:45 +0200
committerDaniel Mack <daniel@zonque.org>2015-08-06 10:14:41 +0200
commitbbc2908635ca3ded9162504683fa126809f0ec14 (patch)
treed667bb2afaaef914cbc262e3b6e4220325722bbf /src/core/unit.h
parentd5972272d2b725ab6a2789899f8b6c1d2a8113e3 (diff)
core: dbus: track bus names per unit
Currently, PID1 installs an unfiltered NameOwnerChanged signal match, and dispatches the signals itself. This does not scale, as right now, PID1 wakes up every time a bus client connects. To fix this, install individual matches once they are requested by unit_watch_bus_name(), and remove the watches again through their slot in unit_unwatch_bus_name(). If the bus is not available during unit_watch_bus_name(), just store name in the 'watch_bus' hashmap, and let bus_setup_api() do the installing later.
Diffstat (limited to 'src/core/unit.h')
-rw-r--r--src/core/unit.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/core/unit.h b/src/core/unit.h
index e60168267f..9df5a7e6fb 100644
--- a/src/core/unit.h
+++ b/src/core/unit.h
@@ -115,6 +115,9 @@ struct Unit {
/* JOB_NOP jobs are special and can be installed without disturbing the real job. */
Job *nop_job;
+ /* The slot used for watching NameOwnerChanged signals */
+ sd_bus_slot *match_bus_slot;
+
/* Job timeout and action to take */
usec_t job_timeout;
FailureAction job_timeout_action;
@@ -522,6 +525,7 @@ void unit_unwatch_all_pids(Unit *u);
void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2);
+int unit_install_bus_match(sd_bus *bus, Unit *u, const char *name);
int unit_watch_bus_name(Unit *u, const char *name);
void unit_unwatch_bus_name(Unit *u, const char *name);