[gnome-builder] libide-debugger: port to GTK 4 and IdeRunContext
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] libide-debugger: port to GTK 4 and IdeRunContext
- Date: Tue, 12 Jul 2022 06:39:12 +0000 (UTC)
commit fb459d96a42ab79e58f2830c8538a21a6113ef49
Author: Christian Hergert <chergert redhat com>
Date: Mon Jul 11 21:20:00 2022 -0700
libide-debugger: port to GTK 4 and IdeRunContext
src/libide/debugger/ide-debug-manager-private.h | 37 ++++
src/libide/debugger/ide-debug-manager.c | 216 ++++++++----------------
src/libide/debugger/ide-debugger.c | 34 ++--
src/libide/debugger/ide-debugger.h | 31 ++--
src/libide/debugger/meson.build | 1 -
5 files changed, 145 insertions(+), 174 deletions(-)
---
diff --git a/src/libide/debugger/ide-debug-manager-private.h b/src/libide/debugger/ide-debug-manager-private.h
new file mode 100644
index 000000000..c4c5ed648
--- /dev/null
+++ b/src/libide/debugger/ide-debug-manager-private.h
@@ -0,0 +1,37 @@
+/* ide-debug-manager-private.h
+ *
+ * Copyright 2022 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#include "ide-debug-manager.h"
+
+#include <libide-foundry.h>
+
+G_BEGIN_DECLS
+
+gboolean _ide_debug_manager_prepare (IdeDebugManager *self,
+ IdePipeline *pipeline,
+ IdeRunCommand *run_command,
+ IdeRunContext *run_context,
+ GError **error);
+void _ide_debug_manager_started (IdeDebugManager *self);
+void _ide_debug_manager_stopped (IdeDebugManager *self);
+
+G_END_DECLS
diff --git a/src/libide/debugger/ide-debug-manager.c b/src/libide/debugger/ide-debug-manager.c
index 61a7846f6..f80be75c3 100644
--- a/src/libide/debugger/ide-debug-manager.c
+++ b/src/libide/debugger/ide-debug-manager.c
@@ -22,17 +22,17 @@
#include "config.h"
-#include <dazzle.h>
#include <glib/gi18n.h>
+#include <stdlib.h>
+#include <string.h>
+
#include <libide-code.h>
#include <libide-plugins.h>
#include <libide-threading.h>
-#include <stdlib.h>
-#include <string.h>
#include "ide-buffer-private.h"
-#include "ide-debug-manager.h"
+#include "ide-debug-manager-private.h"
#include "ide-debugger.h"
#include "ide-debugger-private.h"
@@ -44,8 +44,7 @@ struct _IdeDebugManager
GHashTable *breakpoints;
IdeDebugger *debugger;
- DzlSignalGroup *debugger_signals;
- IdeRunner *runner;
+ IdeSignalGroup *debugger_signals;
GQueue pending_breakpoints;
GPtrArray *supported_languages;
@@ -58,8 +57,9 @@ typedef struct
{
IdeDebugManager *self;
IdeDebugger *debugger;
- IdeRunner *runner;
- gint priority;
+ IdePipeline *pipeline;
+ IdeRunCommand *run_command;
+ int priority;
} DebuggerLookup;
enum {
@@ -295,9 +295,6 @@ ide_debug_manager_debugger_stopped (IdeDebugManager *self,
case IDE_DEBUGGER_STOP_EXITED:
case IDE_DEBUGGER_STOP_EXITED_NORMALLY:
case IDE_DEBUGGER_STOP_EXITED_SIGNALED:
- /* Cleanup any lingering debugger process */
- if (self->runner != NULL)
- ide_runner_force_quit (self->runner);
break;
case IDE_DEBUGGER_STOP_BREAKPOINT_HIT:
@@ -554,9 +551,8 @@ ide_debug_manager_dispose (GObject *object)
g_queue_clear (&self->pending_breakpoints);
g_hash_table_remove_all (self->breakpoints);
- dzl_signal_group_set_target (self->debugger_signals, NULL);
+ ide_signal_group_set_target (self->debugger_signals, NULL);
ide_clear_and_destroy_object (&self->debugger);
- ide_clear_and_destroy_object (&self->runner);
G_OBJECT_CLASS (ide_debug_manager_parent_class)->dispose (object);
}
@@ -698,55 +694,34 @@ ide_debug_manager_init (IdeDebugManager *self)
g_object_unref,
g_object_unref);
- self->debugger_signals = dzl_signal_group_new (IDE_TYPE_DEBUGGER);
+ self->debugger_signals = ide_signal_group_new (IDE_TYPE_DEBUGGER);
- dzl_signal_group_connect_swapped (self->debugger_signals,
+ ide_signal_group_connect_swapped (self->debugger_signals,
"stopped",
G_CALLBACK (ide_debug_manager_debugger_stopped),
self);
- dzl_signal_group_connect_swapped (self->debugger_signals,
+ ide_signal_group_connect_swapped (self->debugger_signals,
"running",
G_CALLBACK (ide_debug_manager_debugger_running),
self);
- dzl_signal_group_connect_swapped (self->debugger_signals,
+ ide_signal_group_connect_swapped (self->debugger_signals,
"breakpoint-added",
G_CALLBACK (ide_debug_manager_breakpoint_added),
self);
- dzl_signal_group_connect_swapped (self->debugger_signals,
+ ide_signal_group_connect_swapped (self->debugger_signals,
"breakpoint-modified",
G_CALLBACK (ide_debug_manager_breakpoint_modified),
self);
- dzl_signal_group_connect_swapped (self->debugger_signals,
+ ide_signal_group_connect_swapped (self->debugger_signals,
"breakpoint-removed",
G_CALLBACK (ide_debug_manager_breakpoint_removed),
self);
}
-static gboolean
-debugger_supports_language (PeasPluginInfo *plugin_info,
- const gchar *language)
-{
- const gchar *supported;
-
- supported = peas_plugin_info_get_external_data (plugin_info, "Debugger-Languages");
-
- if (supported != NULL)
- {
- g_auto(GStrv) languages = g_strsplit (supported, ",", 0);
- for (guint i = 0; languages[i]; i++)
- {
- if (g_strcmp0 (languages[i], language) == 0)
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
static void
debugger_lookup (PeasExtensionSet *set,
PeasPluginInfo *plugin_info,
@@ -764,18 +739,8 @@ debugger_lookup (PeasExtensionSet *set,
ide_object_append (IDE_OBJECT (lookup->self), IDE_OBJECT (debugger));
- if (ide_debugger_supports_runner (debugger, lookup->runner, &priority))
+ if (ide_debugger_supports_run_command (debugger, lookup->pipeline, lookup->run_command, &priority))
{
- IdeBuildTarget *build_target = ide_runner_get_build_target (lookup->runner);
-
- if (build_target != NULL)
- {
- g_autofree gchar *language = ide_build_target_get_language (build_target);
-
- if (!debugger_supports_language (plugin_info, language))
- goto failure;
- }
-
if (lookup->debugger == NULL || priority < lookup->priority)
{
ide_clear_and_destroy_object (&lookup->debugger);
@@ -785,35 +750,25 @@ debugger_lookup (PeasExtensionSet *set,
}
}
-failure:
ide_object_destroy (IDE_OBJECT (debugger));
}
-/**
- * ide_debug_manager_find_debugger:
- * @self: a #IdeDebugManager
- * @runner: An #IdeRunner
- *
- * Locates a debugger for the given runner, or %NULL if no debugger
- * supports the runner.
- *
- * Returns: (transfer full) (nullable): An #IdeDebugger or %NULL
- *
- * Since: 3.32
- */
-IdeDebugger *
+static IdeDebugger *
ide_debug_manager_find_debugger (IdeDebugManager *self,
- IdeRunner *runner)
+ IdePipeline *pipeline,
+ IdeRunCommand *run_command)
{
g_autoptr(PeasExtensionSet) set = NULL;
DebuggerLookup lookup;
- g_return_val_if_fail (IDE_IS_DEBUG_MANAGER (self), NULL);
- g_return_val_if_fail (IDE_IS_RUNNER (runner), NULL);
+ g_assert (IDE_IS_DEBUG_MANAGER (self));
+ g_assert (IDE_IS_PIPELINE (pipeline));
+ g_assert (IDE_IS_RUN_COMMAND (run_command));
lookup.self = self;
lookup.debugger = NULL;
- lookup.runner = runner;
+ lookup.run_command = run_command;
+ lookup.pipeline = pipeline;
lookup.priority = G_MAXINT;
set = peas_extension_set_new (peas_engine_get_default (),
@@ -929,34 +884,38 @@ ide_debug_manager_sync_breakpoints (IdeDebugManager *self)
IDE_EXIT;
}
-static void
-ide_debug_manager_runner_spawned (IdeDebugManager *self,
- const gchar *identifier,
- IdeRunner *runner)
+void
+_ide_debug_manager_started (IdeDebugManager *self)
{
+ IDE_ENTRY;
+
g_assert (IDE_IS_DEBUG_MANAGER (self));
- g_assert (identifier != NULL);
- g_assert (IDE_IS_RUNNER (runner));
+
+ if (self->debugger == NULL)
+ IDE_EXIT;
ide_debug_manager_sync_breakpoints (self);
+
+ IDE_EXIT;
}
-static void
-ide_debug_manager_runner_exited (IdeDebugManager *self,
- IdeRunner *runner)
+void
+_ide_debug_manager_stopped (IdeDebugManager *self)
{
g_autoptr(IdeDebugger) debugger = NULL;
- g_autoptr(IdeRunner) hold_runner = NULL;
+
+ IDE_ENTRY;
g_assert (IDE_IS_DEBUG_MANAGER (self));
- g_assert (IDE_IS_RUNNER (runner));
+
+ if (self->debugger == NULL)
+ IDE_EXIT;
/*
* Keep debugger alive so that listeners to :debugger property can
* properly disconnect signals when we clear the debugger instance.
*/
debugger = g_steal_pointer (&self->debugger);
- hold_runner = g_steal_pointer (&self->runner);
ide_debug_manager_set_active (self, FALSE);
ide_debug_manager_reset_breakpoints (self);
@@ -965,96 +924,65 @@ ide_debug_manager_runner_exited (IdeDebugManager *self,
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_DEBUGGER]);
ide_clear_and_destroy_object (&debugger);
- ide_clear_and_destroy_object (&hold_runner);
+
+ IDE_EXIT;
}
-/**
- * ide_debug_manager_start:
+/* _ide_debug_manager_prepare:
* @self: an #IdeDebugManager
- * @runner: an #IdeRunner
+ * @pipeline: an #IdePipeline
+ * @run_command: an #IdeRunCommand
+ * @run_context: an #IdeRunContext
* @error: A location for an @error
*
- * Attempts to start a runner using a discovered debugger backend.
+ * Locates a suitable debugger and prepares it.
*
- * Returns: %TRUE if successful; otherwise %FALSE and @error is set.
+ * A suitable debugger is located and prepared to run so that when
+ * @run_context is spawned, the debug manager can communicate with
+ * the inferior process.
*
- * Since: 3.32
+ * Returns: %TRUE if successful; otherwise %FALSE and @error is set.
*/
gboolean
-ide_debug_manager_start (IdeDebugManager *self,
- IdeRunner *runner,
- GError **error)
+_ide_debug_manager_prepare (IdeDebugManager *self,
+ IdePipeline *pipeline,
+ IdeRunCommand *run_command,
+ IdeRunContext *run_context,
+ GError **error)
{
g_autoptr(IdeDebugger) debugger = NULL;
- IdeEnvironment *environment;
- gboolean ret = FALSE;
IDE_ENTRY;
g_return_val_if_fail (IDE_IS_DEBUG_MANAGER (self), FALSE);
- g_return_val_if_fail (IDE_IS_RUNNER (runner), FALSE);
+ g_return_val_if_fail (IDE_IS_RUN_COMMAND (run_command), FALSE);
+ g_return_val_if_fail (IDE_IS_RUN_CONTEXT (run_context), FALSE);
g_return_val_if_fail (self->debugger == NULL, FALSE);
- debugger = ide_debug_manager_find_debugger (self, runner);
-
- if (debugger == NULL)
+ if (!(debugger = ide_debug_manager_find_debugger (self, pipeline, run_command)))
{
- ide_runner_set_failed (runner, TRUE);
- g_set_error (error,
- G_IO_ERROR,
- G_IO_ERROR_NOT_SUPPORTED,
- _("A suitable debugger was not found."));
- IDE_GOTO (failure);
+ g_set_error_literal (error,
+ G_IO_ERROR,
+ G_IO_ERROR_NOT_SUPPORTED,
+ _("A suitable debugger could not be found."));
+ IDE_RETURN (FALSE);
}
- environment = ide_runner_get_environment (runner);
- ide_environment_setenv (environment, "G_MESSAGES_DEBUG", "all");
- ide_debugger_prepare (debugger, runner);
-
- g_signal_connect_object (runner,
- "spawned",
- G_CALLBACK (ide_debug_manager_runner_spawned),
- self,
- G_CONNECT_SWAPPED);
-
- g_signal_connect_object (runner,
- "exited",
- G_CALLBACK (ide_debug_manager_runner_exited),
- self,
- G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+ ide_debugger_prepare_for_run (debugger, pipeline, run_context);
- self->runner = g_object_ref (runner);
- self->debugger = g_steal_pointer (&debugger);
+ if (self->stop_at_criticals)
+ ide_run_context_setenv (run_context, "G_DEBUG", "fatal-criticals");
+ else if (self->stop_at_warnings)
+ ide_run_context_setenv (run_context, "G_DEBUG", "fatal-warnings");
- dzl_signal_group_set_target (self->debugger_signals, self->debugger);
+ if (g_set_object (&self->debugger, debugger))
+ ide_signal_group_set_target (self->debugger_signals, self->debugger);
ide_debug_manager_set_active (self, TRUE);
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_DEBUGGER]);
- ret = TRUE;
-
-failure:
- IDE_RETURN (ret);
-}
-
-void
-ide_debug_manager_stop (IdeDebugManager *self)
-{
- g_return_if_fail (IDE_IS_DEBUG_MANAGER (self));
-
- dzl_signal_group_set_target (self->debugger_signals, NULL);
-
- if (self->runner != NULL)
- {
- ide_runner_force_quit (self->runner);
- ide_clear_and_destroy_object (&self->runner);
- }
-
- ide_clear_and_destroy_object (&self->debugger);
- ide_debug_manager_reset_breakpoints (self);
-
- g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_DEBUGGER]);
+ IDE_RETURN (TRUE);
}
gboolean
diff --git a/src/libide/debugger/ide-debugger.c b/src/libide/debugger/ide-debugger.c
index e803062b5..3b722d98f 100644
--- a/src/libide/debugger/ide-debugger.c
+++ b/src/libide/debugger/ide-debugger.c
@@ -1845,7 +1845,8 @@ ide_debugger_disassemble_finish (IdeDebugger *self,
/**
* ide_debugger_supports_runner:
* @self: an #IdeDebugger
- * @runner: an #IdeRunner
+ * @pipeline: an #IdePipeline
+ * #run_command: an #IdeRunCommand
* @priority: (out): A location for a priority
*
* Checks if the debugger supports a given runner. The debugger may need
@@ -1854,39 +1855,44 @@ ide_debugger_disassemble_finish (IdeDebugger *self,
* Returns: %TRUE if the #IdeDebugger supports the runner.
*/
gboolean
-ide_debugger_supports_runner (IdeDebugger *self,
- IdeRunner *runner,
- gint *priority)
+ide_debugger_supports_run_command (IdeDebugger *self,
+ IdePipeline *pipeline,
+ IdeRunCommand *run_command,
+ int *priority)
{
- gint dummy = 0;
+ int dummy = 0;
g_return_val_if_fail (IDE_IS_DEBUGGER (self), FALSE);
- g_return_val_if_fail (IDE_IS_RUNNER (runner), FALSE);
+ g_return_val_if_fail (IDE_IS_PIPELINE (pipeline), FALSE);
+ g_return_val_if_fail (IDE_IS_RUN_COMMAND (run_command), FALSE);
if (priority == NULL)
priority = &dummy;
else
*priority = 0;
- return IDE_DEBUGGER_GET_CLASS (self)->supports_runner (self, runner, priority);
+ return IDE_DEBUGGER_GET_CLASS (self)->supports_run_command (self, pipeline, run_command, priority);
}
/**
- * ide_debugger_prepare:
+ * ide_debugger_prepare_for_run:
* @self: an #IdeDebugger
- * @runner: an #IdeRunner
+ * @pipeline: an #IdePipeline
+ * @run_context: an #IdeRunContext
*
* Prepares the runner to launch a debugger and target process.
*/
void
-ide_debugger_prepare (IdeDebugger *self,
- IdeRunner *runner)
+ide_debugger_prepare_for_run (IdeDebugger *self,
+ IdePipeline *pipeline,
+ IdeRunContext *run_context)
{
g_return_if_fail (IDE_IS_DEBUGGER (self));
- g_return_if_fail (IDE_IS_RUNNER (runner));
+ g_return_if_fail (IDE_IS_PIPELINE (pipeline));
+ g_return_if_fail (IDE_IS_RUN_CONTEXT (run_context));
+ g_return_if_fail (IDE_DEBUGGER_GET_CLASS (self)->prepare_for_run != NULL);
- if (IDE_DEBUGGER_GET_CLASS (self)->prepare)
- IDE_DEBUGGER_GET_CLASS (self)->prepare (self, runner);
+ IDE_DEBUGGER_GET_CLASS (self)->prepare_for_run (self, pipeline, run_context);
}
/**
diff --git a/src/libide/debugger/ide-debugger.h b/src/libide/debugger/ide-debugger.h
index b6118052c..728d54aea 100644
--- a/src/libide/debugger/ide-debugger.h
+++ b/src/libide/debugger/ide-debugger.h
@@ -81,11 +81,13 @@ struct _IdeDebuggerClass
/* Virtual Functions */
- gboolean (*supports_runner) (IdeDebugger *self,
- IdeRunner *runner,
- gint *priority);
- void (*prepare) (IdeDebugger *self,
- IdeRunner *runner);
+ gboolean (*supports_run_command) (IdeDebugger *self,
+ IdePipeline *pipeline,
+ IdeRunCommand *run_command,
+ int *priority);
+ void (*prepare_for_run) (IdeDebugger *self,
+ IdePipeline *pipeline,
+ IdeRunContext *run_context);
gboolean (*get_can_move) (IdeDebugger *self,
IdeDebuggerMovement movement);
void (*move_async) (IdeDebugger *self,
@@ -193,18 +195,17 @@ struct _IdeDebuggerClass
gboolean (*interpret_finish) (IdeDebugger *self,
GAsyncResult *result,
GError **error);
-
- /*< private >*/
- gpointer _reserved[32];
};
-IDE_AVAILABLE_IN_3_32
-gboolean ide_debugger_supports_runner (IdeDebugger *self,
- IdeRunner *runner,
- gint *priority);
-IDE_AVAILABLE_IN_3_32
-void ide_debugger_prepare (IdeDebugger *self,
- IdeRunner *runner);
+IDE_AVAILABLE_IN_ALL
+gboolean ide_debugger_supports_run_command (IdeDebugger *self,
+ IdePipeline *pipeline,
+ IdeRunCommand *run_command,
+ int *priority);
+IDE_AVAILABLE_IN_ALL
+void ide_debugger_prepare_for_run (IdeDebugger *self,
+ IdePipeline *pipeline,
+ IdeRunContext *run_context);
IDE_AVAILABLE_IN_ALL
GListModel *ide_debugger_get_breakpoints (IdeDebugger *self);
IDE_AVAILABLE_IN_ALL
diff --git a/src/libide/debugger/meson.build b/src/libide/debugger/meson.build
index b5e72d5c0..87c56c7a0 100644
--- a/src/libide/debugger/meson.build
+++ b/src/libide/debugger/meson.build
@@ -62,7 +62,6 @@ libide_debugger_private_sources = [
libide_debugger_deps = [
libgio_dep,
libgtk_dep,
- libdazzle_dep,
libide_core_dep,
libide_io_dep,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]