return r;
}
-static bool session_ready(Session *s) {
+static bool session_job_pending(Session *s) {
assert(s);
+ assert(s->user);
- /* Returns true when the session is ready, i.e. all jobs we enqueued for it are done (regardless if successful or not) */
+ /* Check if we have some jobs enqueued and not finished yet. Each time we get JobRemoved signal about
+ * relevant units, session_send_create_reply and hence us is called (see match_job_removed).
+ * Note that we don't care about job result here. */
- return !s->scope_job &&
- (!SESSION_CLASS_WANTS_SERVICE_MANAGER(s->class) || !s->user->service_job);
+ return s->scope_job ||
+ s->user->runtime_dir_job ||
+ (SESSION_CLASS_WANTS_SERVICE_MANAGER(s->class) && s->user->service_manager_job);
}
int session_send_create_reply(Session *s, sd_bus_error *error) {
if (!s->create_message)
return 0;
- if (!sd_bus_error_is_set(error) && !session_ready(s))
+ /* If error occurred, return it immediately. Otherwise let's wait for all jobs to finish before
+ * continuing. */
+ if (!sd_bus_error_is_set(error) && session_job_pending(s))
return 0;
c = TAKE_PTR(s->create_message);
if (!s->upgrade_message)
return 0;
- if (!sd_bus_error_is_set(error) && !session_ready(s))
+ /* See comments in session_send_create_reply */
+ if (!sd_bus_error_is_set(error) && session_job_pending(s))
return 0;
c = TAKE_PTR(s->upgrade_message);