Differential D25350 Diff 69865 libs/dbus/0001-Add-support-for-auto-shutdown-dbus-daemon-after-last.patch
Changeset View
Changeset View
Standalone View
Standalone View
libs/dbus/0001-Add-support-for-auto-shutdown-dbus-daemon-after-last.patch
- This file was added.
1 | From 78ee2681919740331ce773b6b4a613ba77e8353c Mon Sep 17 00:00:00 2001 | ||||
---|---|---|---|---|---|
2 | From: Ralf Habacker <ralf.habacker@freenet.de> | ||||
3 | Date: Tue, 11 Apr 2017 11:17:40 +0200 | ||||
4 | Subject: [PATCH] Add support for auto shutdown dbus-daemon after last client | ||||
5 | disconnects on Windows. | ||||
6 | | ||||
7 | By default dbus-daemon on Windows is auto started on request by any dbus | ||||
8 | client application and now also shutdown itself after the last | ||||
9 | client has been disconnected to free unused system resources and | ||||
10 | simplifies portable installations. | ||||
11 | | ||||
12 | The auto shutting down behavior could be disabled by specifing | ||||
13 | --disable-auto-shutdown on dbus-daemon command line. | ||||
14 | | ||||
15 | https://bugs.freedesktop.org/show_bug.cgi?id=99751 | ||||
16 | --- | ||||
17 | bus/bus.c | 33 +++++++++++++++++++++++++++++++++ | ||||
18 | bus/bus.h | 14 ++++++++++++++ | ||||
19 | bus/connection.c | 22 ++++++++++++++++++++++ | ||||
20 | bus/main.c | 19 +++++++++++++++++++ | ||||
21 | dbus/dbus-sysdeps-unix.c | 6 ++++++ | ||||
22 | dbus/dbus-sysdeps-win.c | 28 +++++++++++++++++++++++++--- | ||||
23 | dbus/dbus-sysdeps.h | 2 ++ | ||||
24 | doc/dbus-daemon.1.xml.in | 10 ++++++++++ | ||||
25 | 8 files changed, 131 insertions(+), 3 deletions(-) | ||||
26 | | ||||
27 | diff --git a/bus/bus.c b/bus/bus.c | ||||
28 | index 2ad8e789..0a9e9fe8 100644 | ||||
29 | --- a/bus/bus.c | ||||
30 | +++ b/bus/bus.c | ||||
31 | @@ -75,6 +75,7 @@ struct BusContext | ||||
32 | unsigned int allow_anonymous : 1; | ||||
33 | unsigned int systemd_activation : 1; | ||||
34 | dbus_bool_t watches_enabled; | ||||
35 | + dbus_bool_t auto_shutdown_enabled; | ||||
36 | }; | ||||
37 | | ||||
38 | static dbus_int32_t server_data_slot = -1; | ||||
39 | @@ -1831,3 +1832,35 @@ bus_context_check_all_watches (BusContext *context) | ||||
40 | _dbus_server_toggle_all_watches (server, enabled); | ||||
41 | } | ||||
42 | } | ||||
43 | + | ||||
44 | +#ifdef DBUS_ENABLE_EMBEDDED_TESTS | ||||
45 | +void | ||||
46 | +bus_context_quiet_log_begin (BusContext *context) | ||||
47 | +{ | ||||
48 | + context->quiet_log = TRUE; | ||||
49 | +} | ||||
50 | + | ||||
51 | +void | ||||
52 | +bus_context_quiet_log_end (BusContext *context) | ||||
53 | +{ | ||||
54 | + context->quiet_log = FALSE; | ||||
55 | +} | ||||
56 | + | ||||
57 | +dbus_bool_t | ||||
58 | +bus_context_get_quiet_log (BusContext *context) | ||||
59 | +{ | ||||
60 | + return context->quiet_log; | ||||
61 | +} | ||||
62 | +#endif | ||||
63 | + | ||||
64 | +dbus_bool_t | ||||
65 | +bus_context_get_auto_shutdown_enabled (BusContext *context) | ||||
66 | +{ | ||||
67 | + return context->auto_shutdown_enabled; | ||||
68 | +} | ||||
69 | + | ||||
70 | +void | ||||
71 | +bus_context_set_auto_shutdown_enabled (BusContext *context, dbus_bool_t state) | ||||
72 | +{ | ||||
73 | + context->auto_shutdown_enabled = state; | ||||
74 | +} | ||||
75 | diff --git a/bus/bus.h b/bus/bus.h | ||||
76 | index 2e0de825..530f2d63 100644 | ||||
77 | --- a/bus/bus.h | ||||
78 | +++ b/bus/bus.h | ||||
79 | @@ -146,4 +146,18 @@ dbus_bool_t bus_context_check_security_policy (BusContext | ||||
80 | DBusError *error); | ||||
81 | void bus_context_check_all_watches (BusContext *context); | ||||
82 | | ||||
83 | +dbus_bool_t bus_context_setup_server (BusContext *context, | ||||
84 | + DBusServer *server, | ||||
85 | + DBusError *error); | ||||
86 | +dbus_bool_t bus_context_add_incoming_connection (BusContext *context, | ||||
87 | + DBusConnection *new_connection); | ||||
88 | +dbus_bool_t bus_context_get_auto_shutdown_enabled (BusContext *context); | ||||
89 | +void bus_context_set_auto_shutdown_enabled (BusContext *context, | ||||
90 | + dbus_bool_t state); | ||||
91 | +#ifdef DBUS_ENABLE_EMBEDDED_TESTS | ||||
92 | +void bus_context_quiet_log_begin (BusContext *context); | ||||
93 | +void bus_context_quiet_log_end (BusContext *context); | ||||
94 | +dbus_bool_t bus_context_get_quiet_log (BusContext *context); | ||||
95 | +#endif | ||||
96 | + | ||||
97 | #endif /* BUS_BUS_H */ | ||||
98 | diff --git a/bus/connection.c b/bus/connection.c | ||||
99 | index 53605fa3..eba9ca7e 100644 | ||||
100 | --- a/bus/connection.c | ||||
101 | +++ b/bus/connection.c | ||||
102 | @@ -340,6 +340,27 @@ bus_connection_disconnected (DBusConnection *connection) | ||||
103 | | ||||
104 | bus_connection_drop_pending_replies (d->connections, connection); | ||||
105 | | ||||
106 | + if (bus_connections_get_n_active (d->connections) | ||||
107 | + + bus_connections_get_n_incomplete (d->connections) == 0) | ||||
108 | + { | ||||
109 | + if (bus_context_get_auto_shutdown_enabled (d->connections->context)) | ||||
110 | + { | ||||
111 | + if (_dbus_daemon_lock_autolaunch_address ()) | ||||
112 | + { | ||||
113 | + DBusLoop *loop = bus_context_get_loop (d->connections->context); | ||||
114 | + _dbus_loop_quit (loop); | ||||
115 | + _dbus_verbose ("Got auto shutdown request - quit event loop\n"); | ||||
116 | + } | ||||
117 | + else | ||||
118 | + { | ||||
119 | + // We are not able to lock autolaunch address mutex because a | ||||
120 | + // dbus client tries to fetch autolaunch address as part of the | ||||
121 | + // autolaunch connection attempt | ||||
122 | + _dbus_verbose ("Could not lock autolaunch address - skipping shutdown"); | ||||
123 | + } | ||||
124 | + } | ||||
125 | + } | ||||
126 | + | ||||
127 | /* frees "d" as side effect */ | ||||
128 | dbus_connection_set_data (connection, | ||||
129 | connection_data_slot, | ||||
130 | @@ -1576,6 +1597,7 @@ bus_connection_complete (DBusConnection *connection, | ||||
131 | return FALSE; | ||||
132 | } | ||||
133 | | ||||
134 | + | ||||
135 | if (dbus_connection_get_unix_user (connection, &uid)) | ||||
136 | { | ||||
137 | if (!adjust_connections_for_uid (d->connections, | ||||
138 | diff --git a/bus/main.c b/bus/main.c | ||||
139 | index 4ee3f75d..d2eacc99 100644 | ||||
140 | --- a/bus/main.c | ||||
141 | +++ b/bus/main.c | ||||
142 | @@ -163,6 +163,9 @@ usage (void) | ||||
143 | " [--syslog]" | ||||
144 | " [--syslog-only]" | ||||
145 | " [--nofork]" | ||||
146 | +#ifdef DBUS_WIN | ||||
147 | + " [--disable-auto-shutdown]" | ||||
148 | +#endif | ||||
149 | #ifdef DBUS_UNIX | ||||
150 | " [--fork]" | ||||
151 | " [--systemd-activation]" | ||||
152 | @@ -401,6 +404,9 @@ main (int argc, char **argv) | ||||
153 | int i; | ||||
154 | dbus_bool_t print_address; | ||||
155 | dbus_bool_t print_pid; | ||||
156 | +#ifdef DBUS_WIN | ||||
157 | + dbus_bool_t auto_shutdown; | ||||
158 | +#endif | ||||
159 | BusContextFlags flags; | ||||
160 | #ifdef DBUS_UNIX | ||||
161 | const char *error_str; | ||||
162 | @@ -438,6 +444,9 @@ main (int argc, char **argv) | ||||
163 | | ||||
164 | print_address = FALSE; | ||||
165 | print_pid = FALSE; | ||||
166 | +#ifdef DBUS_WIN | ||||
167 | + auto_shutdown = TRUE; | ||||
168 | +#endif | ||||
169 | | ||||
170 | flags = BUS_CONTEXT_FLAG_WRITE_PID_FILE; | ||||
171 | | ||||
172 | @@ -614,6 +623,12 @@ main (int argc, char **argv) | ||||
173 | { | ||||
174 | print_pid = TRUE; /* and we'll get the next arg if appropriate */ | ||||
175 | } | ||||
176 | +#ifdef DBUS_WIN | ||||
177 | + else if (strcmp (arg, "--disable-auto-shutdown") == 0) | ||||
178 | + { | ||||
179 | + auto_shutdown = FALSE; | ||||
180 | + } | ||||
181 | +#endif | ||||
182 | else | ||||
183 | { | ||||
184 | usage (); | ||||
185 | @@ -701,6 +716,10 @@ main (int argc, char **argv) | ||||
186 | exit (1); | ||||
187 | } | ||||
188 | | ||||
189 | +#ifdef DBUS_WIN | ||||
190 | + if (auto_shutdown) | ||||
191 | + bus_context_set_auto_shutdown_enabled (context, TRUE); | ||||
192 | +#endif | ||||
193 | /* bus_context_new() closes the print_addr_pipe and | ||||
194 | * print_pid_pipe | ||||
195 | */ | ||||
196 | diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c | ||||
197 | index e8cd5b33..39d9363d 100644 | ||||
198 | --- a/dbus/dbus-sysdeps-unix.c | ||||
199 | +++ b/dbus/dbus-sysdeps-unix.c | ||||
200 | @@ -4348,6 +4348,12 @@ _dbus_daemon_publish_session_bus_address (const char* addr, | ||||
201 | return TRUE; | ||||
202 | } | ||||
203 | | ||||
204 | +dbus_bool_t | ||||
205 | +_dbus_daemon_lock_autolaunch_address () | ||||
206 | +{ | ||||
207 | + return FALSE; | ||||
208 | +} | ||||
209 | + | ||||
210 | //PENDING(kdab) docs | ||||
211 | void | ||||
212 | _dbus_daemon_unpublish_session_bus_address (void) | ||||
213 | diff --git a/dbus/dbus-sysdeps-win.c b/dbus/dbus-sysdeps-win.c | ||||
214 | index 0deedeaf..84f35769 100644 | ||||
215 | --- a/dbus/dbus-sysdeps-win.c | ||||
216 | +++ b/dbus/dbus-sysdeps-win.c | ||||
217 | @@ -2859,6 +2859,25 @@ _dbus_daemon_is_session_bus_address_published (const char *scope) | ||||
218 | return FALSE; | ||||
219 | } | ||||
220 | | ||||
221 | +/** | ||||
222 | + * Lock access to autolaunched address | ||||
223 | + * | ||||
224 | + * This function is called to prevent client from accessing | ||||
225 | + * autolaunch address in shared memory segment as preparation | ||||
226 | + * to shutdown server | ||||
227 | + * @return TRUE lock has been gotten | ||||
228 | + * @return FALSE lock has not been gotten | ||||
229 | + */ | ||||
230 | +dbus_bool_t | ||||
231 | +_dbus_daemon_lock_autolaunch_address () | ||||
232 | +{ | ||||
233 | + HANDLE lock; | ||||
234 | + | ||||
235 | + // sync _dbus_daemon_publish_session_bus_address, _dbus_daemon_unpublish_session_bus_address, | ||||
236 | + // _dbus_daemon_already_runs and _dbus_daemon_lock_autolaunch_address | ||||
237 | + return _dbus_global_lock (cUniqueDBusInitMutex) != FALSE; | ||||
238 | +} | ||||
239 | + | ||||
240 | dbus_bool_t | ||||
241 | _dbus_daemon_publish_session_bus_address (const char* address, const char *scope) | ||||
242 | { | ||||
243 | @@ -2876,7 +2895,8 @@ _dbus_daemon_publish_session_bus_address (const char* address, const char *scope | ||||
244 | return FALSE; | ||||
245 | } | ||||
246 | | ||||
247 | - // sync _dbus_daemon_publish_session_bus_address, _dbus_daemon_unpublish_session_bus_address and _dbus_daemon_already_runs | ||||
248 | + // sync _dbus_daemon_publish_session_bus_address, _dbus_daemon_unpublish_session_bus_address, | ||||
249 | + // _dbus_daemon_already_runs and _dbus_daemon_lock_autolaunch_address | ||||
250 | lock = _dbus_global_lock( cUniqueDBusInitMutex ); | ||||
251 | | ||||
252 | if (!hDBusDaemonMutex) | ||||
253 | @@ -2929,7 +2949,8 @@ _dbus_daemon_unpublish_session_bus_address (void) | ||||
254 | { | ||||
255 | HANDLE lock; | ||||
256 | | ||||
257 | - // sync _dbus_daemon_publish_session_bus_address, _dbus_daemon_unpublish_session_bus_address and _dbus_daemon_already_runs | ||||
258 | + // sync _dbus_daemon_publish_session_bus_address, _dbus_daemon_unpublish_session_bus_address, | ||||
259 | + // _dbus_daemon_already_runs and _dbus_daemon_lock_autolaunch_address | ||||
260 | lock = _dbus_global_lock( cUniqueDBusInitMutex ); | ||||
261 | | ||||
262 | CloseHandle( hDBusSharedMem ); | ||||
263 | @@ -2996,7 +3017,8 @@ _dbus_daemon_already_runs (DBusString *address, DBusString *shm_name, const char | ||||
264 | return FALSE; | ||||
265 | } | ||||
266 | | ||||
267 | - // sync _dbus_daemon_publish_session_bus_address, _dbus_daemon_unpublish_session_bus_address and _dbus_daemon_already_runs | ||||
268 | + // sync _dbus_daemon_publish_session_bus_address, _dbus_daemon_unpublish_session_bus_address, | ||||
269 | + // _dbus_daemon_already_runs and _dbus_daemon_lock_autolaunch_address | ||||
270 | lock = _dbus_global_lock( cUniqueDBusInitMutex ); | ||||
271 | | ||||
272 | // do checks | ||||
273 | diff --git a/dbus/dbus-sysdeps.h b/dbus/dbus-sysdeps.h | ||||
274 | index 24fbec6a..df7fd3c9 100644 | ||||
275 | --- a/dbus/dbus-sysdeps.h | ||||
276 | +++ b/dbus/dbus-sysdeps.h | ||||
277 | @@ -630,6 +630,8 @@ void _dbus_logv (DBusSystemLogSeverity severity, | ||||
278 | _DBUS_BYTE_OF_PRIMITIVE (a, 6) == _DBUS_BYTE_OF_PRIMITIVE (b, 6) && \ | ||||
279 | _DBUS_BYTE_OF_PRIMITIVE (a, 7) == _DBUS_BYTE_OF_PRIMITIVE (b, 7)) | ||||
280 | | ||||
281 | +DBUS_PRIVATE_EXPORT | ||||
282 | +dbus_bool_t _dbus_daemon_lock_autolaunch_address(); | ||||
283 | dbus_bool_t _dbus_get_autolaunch_address (const char *scope, | ||||
284 | DBusString *address, | ||||
285 | DBusError *error); | ||||
286 | diff --git a/doc/dbus-daemon.1.xml.in b/doc/dbus-daemon.1.xml.in | ||||
287 | index 960da080..6e65a5af 100644 | ||||
288 | --- a/doc/dbus-daemon.1.xml.in | ||||
289 | +++ b/doc/dbus-daemon.1.xml.in | ||||
290 | @@ -32,6 +32,7 @@ | ||||
291 | <arg choice='opt'>--nosyslog </arg> | ||||
292 | <arg choice='opt'>--syslog </arg> | ||||
293 | <arg choice='opt'>--syslog-only </arg> | ||||
294 | + <arg choice='opt'>--disable-auto-shutdown </arg> | ||||
295 | <sbr/> | ||||
296 | </cmdsynopsis> | ||||
297 | </refsynopsisdiv> | ||||
298 | @@ -199,6 +200,15 @@ files.</para> | ||||
299 | </listitem> | ||||
300 | </varlistentry> | ||||
301 | | ||||
302 | + <varlistentry> | ||||
303 | + <term><option>--disable-auto-shutdown</option></term> | ||||
304 | + <listitem> | ||||
305 | + <para>On Windows dbus daemon is autolaunched by dbus client library if an | ||||
306 | + autolaunch bus address is specified. After last client disconnects it | ||||
307 | + shuts down by default if not disabled with this switch.</para> | ||||
308 | + </listitem> | ||||
309 | + </varlistentry> | ||||
310 | + | ||||
311 | </variablelist> | ||||
312 | </refsect1> | ||||
313 | | ||||
314 | -- | ||||
315 | 2.16.4 | ||||
316 | |