[geany/geany-plugins] fb28b3: Merge branch 'debugger/thread-support' into debugger/master
Colomban Wendling
git-noreply at xxxxx
Tue Feb 9 01:17:45 UTC 2016
Branch: refs/heads/master
Author: Colomban Wendling <ban at herbesfolles.org>
Committer: Colomban Wendling <ban at herbesfolles.org>
Date: Tue, 09 Feb 2016 01:17:45 UTC
Commit: fb28b3d9fa0a8070f916b1ab891a1f087f513ea6
https://github.com/geany/geany-plugins/commit/fb28b3d9fa0a8070f916b1ab891a1f087f513ea6
Log Message:
-----------
Merge branch 'debugger/thread-support' into debugger/master
Modified Paths:
--------------
debugger/src/breakpoints.h
debugger/src/dbm_gdb.c
debugger/src/debug.c
debugger/src/debug_module.h
debugger/src/stree.c
debugger/src/stree.h
Modified: debugger/src/breakpoints.h
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -33,6 +33,7 @@ typedef enum _break_state {
} break_state;
typedef void (*move_to_line_cb)(const char* file, int line);
+typedef void (*select_thread_cb)(int thread_id);
typedef void (*select_frame_cb)(int frame_number);
gboolean breaks_init(move_to_line_cb callback);
Modified: debugger/src/dbm_gdb.c
28 lines changed, 28 insertions(+), 0 deletions(-)
===================================================================
@@ -1082,6 +1082,34 @@ static void set_active_frame(int frame_number)
g_free(command);
}
+static int get_active_thread(void)
+{
+ struct gdb_mi_record *record = NULL;
+ int current_thread = 0;
+
+ if (RC_DONE == exec_sync_command("-thread-info", TRUE, &record))
+ {
+ const gchar *id = gdb_mi_result_var(record->first, "current-thread-id", GDB_MI_VAL_STRING);
+ current_thread = id ? atoi(id) : 0;
+ }
+ gdb_mi_record_free(record);
+
+ return current_thread;
+}
+
+static gboolean set_active_thread(int thread_id)
+{
+ gchar *command = g_strdup_printf("-thread-select %i", thread_id);
+ gboolean success = (RC_DONE == exec_sync_command(command, TRUE, NULL));
+
+ if (success)
+ set_active_frame(0);
+
+ g_free(command);
+
+ return success;
+}
+
/*
* gets stack
*/
Modified: debugger/src/debug.c
31 lines changed, 30 insertions(+), 1 deletions(-)
===================================================================
@@ -960,6 +960,35 @@ static void on_select_frame(int frame_number)
}
/*
+ * called when a thread should been selected
+ */
+static void on_select_thread(int thread_id)
+{
+ gboolean success;
+
+ if (stack)
+ remove_stack_markers();
+
+ if ((success = active_module->set_active_thread(thread_id)))
+ {
+ g_list_free_full(stack, (GDestroyNotify)frame_unref);
+ stack = active_module->get_stack();
+
+ /* update the stack tree */
+ stree_remove_frames();
+ stree_set_active_thread_id(thread_id);
+ stree_add(stack);
+ stree_select_first_frame(TRUE);
+ }
+
+ if (stack)
+ add_stack_markers();
+
+ if (success)
+ on_select_frame(0);
+}
+
+/*
* init debug related GUI (watch tree view)
* arguments:
*/
@@ -1002,7 +1031,7 @@ void debug_init(void)
gtk_container_add(GTK_CONTAINER(tab_autos), atree);
/* create stack trace page */
- stree = stree_init(editor_open_position, on_select_frame);
+ stree = stree_init(editor_open_position, on_select_thread, on_select_frame);
tab_call_stack = gtk_scrolled_window_new(
gtk_tree_view_get_hadjustment(GTK_TREE_VIEW(stree )),
gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(stree ))
Modified: debugger/src/debug_module.h
7 lines changed, 6 insertions(+), 1 deletions(-)
===================================================================
@@ -121,7 +121,10 @@ typedef struct _dbg_module {
void (*set_active_frame)(int frame_number);
int (*get_active_frame)(void);
-
+
+ gboolean (*set_active_thread)(int thread_id);
+ int (*get_active_thread)(void);
+
GList* (*get_autos) (void);
GList* (*get_watches) (void);
@@ -155,6 +158,8 @@ typedef struct _dbg_module {
get_stack, \
set_active_frame, \
get_active_frame, \
+ set_active_thread, \
+ get_active_thread, \
get_autos, \
get_watches, \
get_files, \
Modified: debugger/src/stree.c
31 lines changed, 16 insertions(+), 15 deletions(-)
===================================================================
@@ -54,6 +54,7 @@ static int active_frame_index = 0;
/* callbacks */
static select_frame_cb select_frame = NULL;
+static select_thread_cb select_thread = NULL;
static move_to_line_cb move_to_line = NULL;
/* tree view, model and store handles */
@@ -284,26 +285,20 @@ static gboolean on_msgwin_button_press(GtkWidget *widget, GdkEventButton *event,
static void on_cursor_changed(GtkTreeView *treeview, gpointer user_data)
{
GtkTreePath *path;
+ GtkTreeIter iter;
+ frame *f;
+ int thread_id;
gtk_tree_view_get_cursor(treeview, &path, NULL);
if (! path)
return;
- if (2 == gtk_tree_path_get_depth(path))
- {
- frame *f;
- GtkTreeIter iter;
+ gtk_tree_model_get_iter (model, &iter, path);
+ gtk_tree_model_get (model, &iter,
+ S_FRAME, &f, S_THREAD_ID, &thread_id, -1);
- gtk_tree_model_get_iter (
- model,
- &iter,
- path);
- gtk_tree_model_get (
- gtk_tree_view_get_model(GTK_TREE_VIEW(tree)),
- &iter,
- S_FRAME, &f,
- -1);
-
+ if (f) /* frame */
+ {
/* check if file name is not empty and we have source files for the frame */
if (f->have_source)
{
@@ -311,6 +306,11 @@ static void on_cursor_changed(GtkTreeView *treeview, gpointer user_data)
}
frame_unref(f);
}
+ else /* thread */
+ {
+ if (thread_id != active_thread_id)
+ select_thread(thread_id);
+ }
gtk_tree_path_free(path);
}
@@ -356,12 +356,13 @@ static void on_render_address (GtkTreeViewColumn *tree_column, GtkCellRenderer *
/*
* inits stack trace tree
*/
-GtkWidget* stree_init(move_to_line_cb ml, select_frame_cb sf)
+GtkWidget* stree_init(move_to_line_cb ml, select_thread_cb st, select_frame_cb sf)
{
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
move_to_line = ml;
+ select_thread = st;
select_frame = sf;
/* create tree view */
Modified: debugger/src/stree.h
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -28,7 +28,7 @@
#include "breakpoints.h"
#include "debug_module.h"
-GtkWidget* stree_init(move_to_line_cb ml, select_frame_cb sf);
+GtkWidget* stree_init(move_to_line_cb ml, select_thread_cb st, select_frame_cb sf);
void stree_destroy(void);
void stree_add(GList *frames);
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Plugins-Commits
mailing list