[geany/geany-plugins] a3ccd4: debugger: Add reference counting to frame objects

Colomban Wendling git-noreply at xxxxx
Sun Feb 7 03:31:38 UTC 2016


Branch:      refs/heads/master
Author:      Colomban Wendling <ban at herbesfolles.org>
Committer:   Colomban Wendling <ban at herbesfolles.org>
Date:        Sun, 07 Feb 2016 03:31:38 UTC
Commit:      a3ccd47da18f2b762ae71dbccee93c037126d80e
             https://github.com/geany/geany-plugins/commit/a3ccd47da18f2b762ae71dbccee93c037126d80e

Log Message:
-----------
debugger: Add reference counting to frame objects

This will allow safe sharing of the frame objects later on.


Modified Paths:
--------------
    debugger/src/debug.c
    debugger/src/debug_module.c
    debugger/src/debug_module.h

Modified: debugger/src/debug.c
6 lines changed, 3 insertions(+), 3 deletions(-)
===================================================================
@@ -640,7 +640,7 @@ static void on_debugger_run (void)
 	if (stack)
 	{
 		remove_stack_markers();
-		g_list_foreach(stack, (GFunc)frame_free, NULL);
+		g_list_foreach(stack, (GFunc)frame_unref, NULL);
 		g_list_free(stack);
 		stack = NULL;
 
@@ -799,7 +799,7 @@ static void on_debugger_exited (int code)
 	if (stack)
 	{
 		remove_stack_markers();
-		g_list_foreach(stack, (GFunc)frame_free, NULL);
+		g_list_foreach(stack, (GFunc)frame_unref, NULL);
 		g_list_free(stack);
 		stack = NULL;
 	}
@@ -1075,7 +1075,7 @@ void debug_destroy(void)
 	if (stack)
 	{
 		remove_stack_markers();
-		g_list_foreach(stack, (GFunc)frame_free, NULL);
+		g_list_foreach(stack, (GFunc)frame_unref, NULL);
 		g_list_free(stack);
 		stack = NULL;
 	}


Modified: debugger/src/debug_module.c
28 lines changed, 15 insertions(+), 13 deletions(-)
===================================================================
@@ -79,26 +79,28 @@ void variable_reset(variable *var)
 /* creates new frame */
 frame* frame_new(void)
 {
-	frame *f = (frame*)malloc(sizeof(frame));
-	memset((void*)f, 0, sizeof(frame));
+	frame *f = g_malloc0(sizeof *f);
+	f->ref_count = 1;
 	return f;
 }
 
-/* frees a frame */
-void frame_free(frame* f)
+/* refs a frame */
+frame* frame_ref(frame* f)
 {
-	if (f->address)
+	f->ref_count++;
+	return f;
+}
+
+/* unrefs a frame */
+void frame_unref(frame* f)
+{
+	if (f->ref_count > 1)
+		f->ref_count--;
+	else
 	{
 		g_free(f->address);
-	}
-	if (f->function)
-	{
 		g_free(f->function);
-	}
-	if (f->file)
-	{
 		g_free(f->file);
+		g_free(f);
 	}
-	
-	g_free(f);
 }


Modified: debugger/src/debug_module.h
6 lines changed, 4 insertions(+), 2 deletions(-)
===================================================================
@@ -79,6 +79,7 @@ typedef struct _variable {
 
 /* type to hold information about a stack frame */
 typedef struct _frame {
+	gint ref_count;
 	gchar *address;
 	gchar *function;
 	gchar *file;
@@ -170,7 +171,8 @@ variable*	variable_new(const gchar *name, variable_type vt);
 variable*	variable_new2(const gchar *name, const gchar *internal, variable_type vt);
 void		variable_reset(variable *var);
 
-frame*	frame_new(void);
-void		frame_free(frame* f);
+frame*		frame_new(void);
+frame*		frame_ref(frame* f);
+void		frame_unref(frame* f);
 
 #endif /* guard */



--------------
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