gboolean ide_subprocess_check_exit_status (IdeSubprocess *self, GError **error) { gint exit_status; g_return_val_if_fail (IDE_IS_SUBPROCESS (self), FALSE); exit_status = ide_subprocess_get_exit_status (self); return g_spawn_check_exit_status (exit_status, error); }
static void ide_subprocess_supervisor_wait_cb (GObject *object, GAsyncResult *result, gpointer user_data) { IdeSubprocess *subprocess = (IdeSubprocess *)object; g_autoptr(IdeSubprocessSupervisor) self = user_data; IdeSubprocessSupervisorPrivate *priv = ide_subprocess_supervisor_get_instance_private (self); g_autoptr(GError) error = NULL; g_return_if_fail (IDE_IS_SUBPROCESS_SUPERVISOR (self)); g_return_if_fail (IDE_IS_SUBPROCESS (subprocess)); if (!ide_subprocess_wait_finish (subprocess, result, &error)) g_warning ("%s", error->message); #ifdef IDE_ENABLE_TRACE { if (ide_subprocess_get_if_exited (subprocess)) IDE_TRACE_MSG ("process exited with code: %u", ide_subprocess_get_exit_status (subprocess)); else IDE_TRACE_MSG ("process terminated due to signal: %u", ide_subprocess_get_term_sig (subprocess)); } #endif /* * If we end up here in response to ide_subprocess_supervisor_reset() force * exiting the process, we won't successfully match * (priv->subprocess==subprocess) and therefore will not restart the process * immediately (allowing the caller of ide_subprocess_supervisor_reset() to * complete the operation. */ if (priv->subprocess == subprocess) { g_clear_object (&priv->subprocess); if (priv->supervising) { gint64 sleep_usec; if (ide_subprocess_supervisor_needs_rate_limit (self, &sleep_usec)) ide_subprocess_supervisor_start_in_usec (self, sleep_usec); else ide_subprocess_supervisor_start (self); } } }