summaryrefslogtreecommitdiff
path: root/bus/activation.c
diff options
context:
space:
mode:
Diffstat (limited to 'bus/activation.c')
-rw-r--r--bus/activation.c67
1 files changed, 46 insertions, 21 deletions
diff --git a/bus/activation.c b/bus/activation.c
index 2744e214..acb2aa89 100644
--- a/bus/activation.c
+++ b/bus/activation.c
@@ -143,6 +143,16 @@ bus_pending_activation_entry_free (BusPendingActivationEntry *entry)
dbus_free (entry);
}
+static void
+handle_timeout_callback (DBusTimeout *timeout,
+ void *data)
+{
+ BusPendingActivation *pending_activation = data;
+
+ while (!dbus_timeout_handle (pending_activation->timeout))
+ _dbus_wait_for_memory ();
+}
+
static BusPendingActivation *
bus_pending_activation_ref (BusPendingActivation *pending_activation)
{
@@ -169,7 +179,8 @@ bus_pending_activation_unref (BusPendingActivation *pending_activation)
if (pending_activation->timeout_added)
{
_dbus_loop_remove_timeout (bus_context_get_loop (pending_activation->activation->context),
- pending_activation->timeout);
+ pending_activation->timeout,
+ handle_timeout_callback, pending_activation);
pending_activation->timeout_added = FALSE;
}
@@ -884,6 +895,8 @@ bus_activation_new (BusContext *context,
DBusError *error)
{
BusActivation *activation;
+ DBusList *link;
+ char *dir;
_DBUS_ASSERT_ERROR_IS_CLEAR (error);
@@ -1324,16 +1337,22 @@ handle_servicehelper_exit_error (int exit_code,
}
}
-static void
-pending_activation_finished_cb (DBusBabysitter *babysitter,
- void *data)
+static dbus_bool_t
+babysitter_watch_callback (DBusWatch *watch,
+ unsigned int condition,
+ void *data)
{
BusPendingActivation *pending_activation = data;
+ dbus_bool_t retval;
+ DBusBabysitter *babysitter;
dbus_bool_t uses_servicehelper;
- _dbus_assert (babysitter == pending_activation->babysitter);
+ babysitter = pending_activation->babysitter;
+
_dbus_babysitter_ref (babysitter);
+ retval = dbus_watch_handle (watch, condition);
+
/* There are two major cases here; are we the system bus or the session? Here this
* is distinguished by whether or not we use a setuid helper launcher. With the launch helper,
* some process exit codes are meaningful, processed by handle_servicehelper_exit_error.
@@ -1344,7 +1363,15 @@ pending_activation_finished_cb (DBusBabysitter *babysitter,
*/
uses_servicehelper = bus_context_get_servicehelper (pending_activation->activation->context) != NULL;
- /* strictly speaking this is redundant with the check in dbus-spawn now */
+ /* FIXME this is broken in the same way that
+ * connection watches used to be; there should be
+ * a separate callback for status change, instead
+ * of doing "if we handled a watch status might
+ * have changed"
+ *
+ * Fixing this lets us move dbus_watch_handle
+ * calls into dbus-mainloop.c
+ */
if (_dbus_babysitter_get_child_exited (babysitter))
{
DBusError error;
@@ -1404,6 +1431,8 @@ pending_activation_finished_cb (DBusBabysitter *babysitter,
}
_dbus_babysitter_unref (babysitter);
+
+ return retval;
}
static dbus_bool_t
@@ -1412,9 +1441,9 @@ add_babysitter_watch (DBusWatch *watch,
{
BusPendingActivation *pending_activation = data;
- return _dbus_loop_add_watch (
- bus_context_get_loop (pending_activation->activation->context),
- watch);
+ return _dbus_loop_add_watch (bus_context_get_loop (pending_activation->activation->context),
+ watch, babysitter_watch_callback, pending_activation,
+ NULL);
}
static void
@@ -1424,7 +1453,7 @@ remove_babysitter_watch (DBusWatch *watch,
BusPendingActivation *pending_activation = data;
_dbus_loop_remove_watch (bus_context_get_loop (pending_activation->activation->context),
- watch);
+ watch, babysitter_watch_callback, pending_activation);
}
static dbus_bool_t
@@ -1672,6 +1701,7 @@ bus_activation_activate_service (BusActivation *activation,
char **envp = NULL;
int argc;
dbus_bool_t retval;
+ DBusHashIter iter;
dbus_bool_t was_pending_activation;
DBusString command;
@@ -1833,7 +1863,10 @@ bus_activation_activate_service (BusActivation *activation,
}
if (!_dbus_loop_add_timeout (bus_context_get_loop (activation->context),
- pending_activation->timeout))
+ pending_activation->timeout,
+ handle_timeout_callback,
+ pending_activation,
+ NULL))
{
_dbus_verbose ("Failed to add timeout for pending activation\n");
@@ -2103,10 +2136,6 @@ bus_activation_activate_service (BusActivation *activation,
_dbus_assert (pending_activation->babysitter != NULL);
- _dbus_babysitter_set_result_function (pending_activation->babysitter,
- pending_activation_finished_cb,
- pending_activation);
-
if (!_dbus_babysitter_set_watch_functions (pending_activation->babysitter,
add_babysitter_watch,
remove_babysitter_watch,
@@ -2538,18 +2567,14 @@ bus_activation_service_reload_test (const DBusString *test_data_dir)
_dbus_assert_not_reached ("could not initiate service reload test");
if (!do_service_reload_test (&directory, FALSE))
- {
- /* Do nothing? */
- }
+ ; /* Do nothing? */
/* Do OOM tests */
if (!init_service_reload_test (&directory))
_dbus_assert_not_reached ("could not initiate service reload test");
if (!do_service_reload_test (&directory, TRUE))
- {
- /* Do nothing? */
- }
+ ; /* Do nothing? */
/* Cleanup test directory */
if (!cleanup_service_reload_test (&directory))