diff options
Diffstat (limited to 'bus/activation.c')
-rw-r--r-- | bus/activation.c | 67 |
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)) |