Author: sgranjoux
Date: Sun Feb 10 11:47:07 2008
New Revision: 3620
URL: http://svn.gnome.org/viewvc/anjuta?rev=3620&view=rev

Log:
        * plugins/debug-manager/command.c,
        plugins/debug-manager/command.h,
        plugins/debug-manager/breakpoints.c,
        libanjuta/interfaces/libanjuta.idl:
        Avoid adding the same breakpoint several times

        * plugins/gdb/debugger.c:
        Fix bug #515463: Deattaching process kill it


Modified:
   trunk/ChangeLog
   trunk/libanjuta/interfaces/libanjuta.idl
   trunk/plugins/debug-manager/breakpoints.c
   trunk/plugins/debug-manager/command.c
   trunk/plugins/debug-manager/command.h
   trunk/plugins/gdb/debugger.c

Modified: trunk/libanjuta/interfaces/libanjuta.idl
==============================================================================
--- trunk/libanjuta/interfaces/libanjuta.idl    (original)
+++ trunk/libanjuta/interfaces/libanjuta.idl    Sun Feb 10 11:47:07 2008
@@ -2911,6 +2911,7 @@
                UNSUPPORTED_FILE_TYPE,
                UNSUPPORTED_VERSION,
                UNABLE_TO_FIND_DEBUGGER,
+               ALREADY_DONE,
                UNKNOWN_ERROR,
                OTHER_ERROR
        }

Modified: trunk/plugins/debug-manager/breakpoints.c
==============================================================================
--- trunk/plugins/debug-manager/breakpoints.c   (original)
+++ trunk/plugins/debug-manager/breakpoints.c   Sun Feb 10 11:47:07 2008
@@ -746,6 +746,7 @@
                breakpoint_item_ref (bi);
                ok = dma_queue_add_breakpoint_at_line (
                                        bd->debugger,
+                                       &(bi->bp.id),                           
                                                           
                                        bi->bp.file,
                                        bi->bp.line,
                                        on_breakpoint_callback,
@@ -756,6 +757,7 @@
                breakpoint_item_ref (bi);
                ok = dma_queue_add_breakpoint_at_function (
                                        bd->debugger,
+                                       &(bi->bp.id),                           
                                                           
                                        bi->bp.file == NULL ? "" : bi->bp.file,
                                        bi->bp.function,
                                        on_breakpoint_callback,
@@ -767,6 +769,7 @@
                breakpoint_item_ref (bi);
                ok = dma_queue_add_breakpoint_at_address (
                                        bd->debugger,
+                                       &(bi->bp.id),                           
                                                           
                                        bi->bp.address,
                                        on_breakpoint_callback,
                                        bi);

Modified: trunk/plugins/debug-manager/command.c
==============================================================================
--- trunk/plugins/debug-manager/command.c       (original)
+++ trunk/plugins/debug-manager/command.c       Sun Feb 10 11:47:07 2008
@@ -298,6 +298,7 @@
                        GList *dirs;
                } attach;
                struct {
+                       guint *id;
                        gchar *file;
                        guint line;
                        gulong address;
@@ -439,18 +440,21 @@
                cmd->user_data = va_arg (args, gpointer);
                break;
        case BREAK_LINE_COMMAND:
+               cmd->data.pos.id = va_arg (args, guint *);
                cmd->data.pos.file = g_strdup (va_arg (args, gchar *));
                cmd->data.pos.line = va_arg (args, guint);
                cmd->callback = va_arg (args, IAnjutaDebuggerCallback);
                cmd->user_data = va_arg (args, gpointer);
                break;
        case BREAK_FUNCTION_COMMAND:
+               cmd->data.pos.id = va_arg (args, guint *);
                cmd->data.pos.file = g_strdup (va_arg (args, gchar *));
                cmd->data.pos.function = g_strdup (va_arg (args, gchar *));
                cmd->callback = va_arg (args, IAnjutaDebuggerCallback);
                cmd->user_data = va_arg (args, gpointer);
                break;
        case BREAK_ADDRESS_COMMAND:
+               cmd->data.pos.id = va_arg (args, guint *);
                cmd->data.pos.address = va_arg (args, gulong);
                cmd->callback = va_arg (args, IAnjutaDebuggerCallback);
                cmd->user_data = va_arg (args, gpointer);
@@ -836,21 +840,21 @@
 }
 
 gboolean
-dma_queue_add_breakpoint_at_line (DmaDebuggerQueue *self, const gchar* file, 
guint line, IAnjutaDebuggerCallback callback, gpointer user_data)
+dma_queue_add_breakpoint_at_line (DmaDebuggerQueue *self, guint *id, const 
gchar* file, guint line, IAnjutaDebuggerCallback callback, gpointer user_data)
 {
-       return dma_debugger_queue_append (self, dma_command_new 
(DMA_BREAK_LINE_COMMAND, file, line, callback, user_data));
+       return dma_debugger_queue_append (self, dma_command_new 
(DMA_BREAK_LINE_COMMAND, id, file, line, callback, user_data));
 }
 
 gboolean
-dma_queue_add_breakpoint_at_function (DmaDebuggerQueue *self, const gchar* 
file, const gchar* function, IAnjutaDebuggerCallback callback, gpointer 
user_data)
+dma_queue_add_breakpoint_at_function (DmaDebuggerQueue *self, guint *id, const 
gchar* file, const gchar* function, IAnjutaDebuggerCallback callback, gpointer 
user_data)
 {
-       return dma_debugger_queue_append (self, dma_command_new 
(DMA_BREAK_FUNCTION_COMMAND, file, function, callback, user_data));
+       return dma_debugger_queue_append (self, dma_command_new 
(DMA_BREAK_FUNCTION_COMMAND, id, file, function, callback, user_data));
 }
 
 gboolean
-dma_queue_add_breakpoint_at_address (DmaDebuggerQueue *self, gulong address, 
IAnjutaDebuggerCallback callback, gpointer user_data)
+dma_queue_add_breakpoint_at_address (DmaDebuggerQueue *self, guint *id, gulong 
address, IAnjutaDebuggerCallback callback, gpointer user_data)
 {
-       return dma_debugger_queue_append (self, dma_command_new 
(DMA_BREAK_ADDRESS_COMMAND, address, callback, user_data));
+       return dma_debugger_queue_append (self, dma_command_new 
(DMA_BREAK_ADDRESS_COMMAND, id, address, callback, user_data));
 }
 
 gboolean
@@ -1065,6 +1069,28 @@
        dma_command_free (cmd);
 }
 
+/* It is possible that the queue contains several add breakpoint command
+ * for the same one. Just before sending the command to the debugger check
+ * that the breakpoint is still not set */
+
+static gboolean
+dma_command_is_breakpoint_pending (DmaQueueCommand *cmd)
+{
+       GError *err;
+       
+       if (*cmd->data.pos.id == 0) return TRUE;                /* Breakpoint 
is not set, can add it */
+       
+       err     = g_error_new (IANJUTA_DEBUGGER_ERROR , 
IANJUTA_DEBUGGER_ALREADY_DONE, "Breakpoint is already set with id %d", 
*cmd->data.pos.id);
+
+       if (cmd->callback != NULL)
+       {
+               cmd->callback (NULL, cmd->user_data, err);
+       }
+       g_error_free (err);
+       
+       return FALSE;
+}
+
 gboolean
 dma_command_run (DmaQueueCommand *cmd, IAnjutaDebugger *debugger,
                                 DmaDebuggerQueue *queue, GError **err)
@@ -1140,13 +1166,34 @@
                ret = ianjuta_debugger_breakpoint_clear 
(IANJUTA_DEBUGGER_BREAKPOINT (debugger), cmd->data.brk.id, callback, queue, 
err);       
                break;
        case BREAK_LINE_COMMAND:
-               ret = ianjuta_debugger_breakpoint_set_at_line 
(IANJUTA_DEBUGGER_BREAKPOINT (debugger), cmd->data.pos.file, 
cmd->data.pos.line, callback, queue, err);   
+               if (dma_command_is_breakpoint_pending (cmd))
+               {       
+                       ret = ianjuta_debugger_breakpoint_set_at_line 
(IANJUTA_DEBUGGER_BREAKPOINT (debugger), cmd->data.pos.file, 
cmd->data.pos.line, callback, queue, err);   
+               }
+               else
+               {
+                       ret = FALSE;
+               }
                break;
        case BREAK_FUNCTION_COMMAND:
-               ret = ianjuta_debugger_breakpoint_set_at_function 
(IANJUTA_DEBUGGER_BREAKPOINT (debugger), cmd->data.pos.file, 
cmd->data.pos.function, callback, queue, err);   
+               if (dma_command_is_breakpoint_pending (cmd))
+               {       
+                       ret = ianjuta_debugger_breakpoint_set_at_function 
(IANJUTA_DEBUGGER_BREAKPOINT (debugger), cmd->data.pos.file, 
cmd->data.pos.function, callback, queue, err);   
+               }
+               else
+               {
+                       ret = FALSE;
+               }
                break;
        case BREAK_ADDRESS_COMMAND:
-               ret = ianjuta_debugger_breakpoint_set_at_address 
(IANJUTA_DEBUGGER_BREAKPOINT (debugger), cmd->data.pos.address, callback, 
queue, err); 
+               if (dma_command_is_breakpoint_pending (cmd))
+               {       
+                       ret = ianjuta_debugger_breakpoint_set_at_address 
(IANJUTA_DEBUGGER_BREAKPOINT (debugger), cmd->data.pos.address, callback, 
queue, err); 
+               }
+               else
+               {
+                       ret = FALSE;
+               }
                break;
        case CONDITION_BREAK_COMMAND:
                ret = ianjuta_debugger_breakpoint_condition 
(IANJUTA_DEBUGGER_BREAKPOINT (debugger), cmd->data.brk.id, 
cmd->data.brk.condition, callback, queue, err);  

Modified: trunk/plugins/debug-manager/command.h
==============================================================================
--- trunk/plugins/debug-manager/command.h       (original)
+++ trunk/plugins/debug-manager/command.h       Sun Feb 10 11:47:07 2008
@@ -98,9 +98,9 @@
 gboolean dma_queue_callback (DmaDebuggerQueue *self, IAnjutaDebuggerCallback 
callback , gpointer user_data);
 void dma_queue_enable_log (DmaDebuggerQueue *self, IAnjutaMessageView *log);
 void dma_queue_disable_log (DmaDebuggerQueue *self);
-gboolean dma_queue_add_breakpoint_at_line (DmaDebuggerQueue *self, const 
gchar* file, guint line, IAnjutaDebuggerCallback callback, gpointer user_data);
-gboolean dma_queue_add_breakpoint_at_function (DmaDebuggerQueue *self, const 
gchar* file, const gchar* function, IAnjutaDebuggerCallback callback, gpointer 
user_data);
-gboolean dma_queue_add_breakpoint_at_address (DmaDebuggerQueue *self, gulong 
address, IAnjutaDebuggerCallback callback, gpointer user_data);
+gboolean dma_queue_add_breakpoint_at_line (DmaDebuggerQueue *self, guint *id, 
const gchar* file, guint line, IAnjutaDebuggerCallback callback, gpointer 
user_data);
+gboolean dma_queue_add_breakpoint_at_function (DmaDebuggerQueue *self, guint 
*id, const gchar* file, const gchar* function, IAnjutaDebuggerCallback 
callback, gpointer user_data);
+gboolean dma_queue_add_breakpoint_at_address (DmaDebuggerQueue *self, guint 
*id, gulong address, IAnjutaDebuggerCallback callback, gpointer user_data);
 gboolean dma_queue_enable_breakpoint (DmaDebuggerQueue *self, guint id, 
gboolean enable, IAnjutaDebuggerCallback callback, gpointer user_data);
 gboolean dma_queue_ignore_breakpoint (DmaDebuggerQueue *self, guint id, guint 
ignore, IAnjutaDebuggerCallback callback, gpointer user_data);
 gboolean dma_queue_condition_breakpoint (DmaDebuggerQueue *self, guint id, 
const gchar *condition, IAnjutaDebuggerCallback callback, gpointer user_data);

Modified: trunk/plugins/gdb/debugger.c
==============================================================================
--- trunk/plugins/gdb/debugger.c        (original)
+++ trunk/plugins/gdb/debugger.c        Sun Feb 10 11:47:07 2008
@@ -1573,7 +1573,9 @@
        
        /* if program is attached - detach from it before quiting */
        if (debugger->priv->prog_is_attached == TRUE)
-               debugger_queue_command (debugger, "detach", FALSE, FALSE, NULL, 
NULL, NULL);
+       {
+               debugger_detach_process(debugger);
+       }
 
        debugger->priv->terminating = TRUE;
        debugger_queue_command (debugger, "-gdb-exit", FALSE, FALSE, NULL, 
NULL, NULL);
@@ -1645,6 +1647,7 @@
        /* Emit signal, state of the debugger must be DEBUGGER_STOPPED */
        debugger->priv->prog_is_running = FALSE;
        debugger->priv->prog_is_attached = FALSE;
+       debugger->priv->inferior_pid = 0;
        debugger->priv->prog_is_loaded = FALSE;
        debugger->priv->debugger_is_busy = 0;
        debugger->priv->debugger_is_started = FALSE;
@@ -1785,7 +1788,11 @@
        }
        debugger->priv->prog_is_attached = TRUE;
        debugger->priv->prog_is_running = TRUE;
-       //debugger_emit_status (debugger);
+       /* It is not really a shared lib event, but it allows to restart
+        * the program after setting breakpoints. It is better to restart
+        * it because we don't have the normal stop frame that tell where
+        * the program is stopped */
+       debugger->priv->solib_event = TRUE;
 }
 
 static void
@@ -1876,7 +1883,9 @@
        g_return_if_fail (debugger->priv->prog_is_running == TRUE);
        
        if (debugger->priv->prog_is_attached == TRUE)
-               debugger_queue_command (debugger, "detach", FALSE, FALSE, NULL, 
NULL, NULL);
+       {
+               debugger_detach_process (debugger);
+       }
        else
        {
                /* FIXME: Why doesn't -exec-abort work??? */
@@ -1906,6 +1915,7 @@
                                                                         
_("Program detached\n"),
                                                                         
debugger->priv->output_user_data);
        }
+       debugger->priv->inferior_pid = 0;
        debugger->priv->prog_is_attached = FALSE;
        debugger->priv->prog_is_running = FALSE;
        g_signal_emit_by_name (debugger->priv->instance, "program-exited");
@@ -1917,7 +1927,7 @@
        gchar *buff;
 
        DEBUG_PRINT ("In function: debugger_detach_process()");
-       
+
        g_return_if_fail (debugger->priv->prog_is_attached == TRUE);
 
        if (debugger->priv->output_callback)
@@ -1930,7 +1940,6 @@
        
        debugger_queue_command (debugger, "detach", FALSE, FALSE, 
                                                        
debugger_detach_process_finish, NULL, NULL);
-       debugger->priv->prog_is_attached = FALSE;
 }
 
 void
_______________________________________________
SVN-commits-list mailing list (read only)
http://mail.gnome.org/mailman/listinfo/svn-commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit 
your options and select the modules ('topics') you want.
Module maintainer? It is possible to set the reply-to to your development 
mailing list. Email [EMAIL PROTECTED] if interested.

Reply via email to