1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 Copyright (C) 2005 Sébastien Granjoux
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 * Keep all debugger command in a FIFO queue
24 *---------------------------------------------------------------------------*/
32 #include <libanjuta/anjuta-debug.h>
33 #include <libanjuta/interfaces/ianjuta-message-manager.h>
34 #include <libanjuta/interfaces/ianjuta-variable-debugger.h>
37 *---------------------------------------------------------------------------*/
39 #define ICON_FILE "anjuta-debug-manager.plugin.png"
42 *---------------------------------------------------------------------------*/
47 NEED_DEBUGGER_STOPPED
= 1 << 8,
48 NEED_DEBUGGER_STARTED
= 1 << 9,
49 NEED_PROGRAM_LOADED
= 1 << 10,
50 NEED_PROGRAM_STOPPED
= 1 << 11,
51 NEED_PROGRAM_RUNNING
= 1 << 12,
53 STOP_DEBUGGER
= 1 << 18,
54 START_DEBUGGER
= 1 << 19,
55 LOAD_PROGRAM
= 1 << 20,
56 STOP_PROGRAM
= 1 << 21,
57 RUN_PROGRAM
= 1 << 22,
59 CHANGE_STATE
= 31 << 18,
61 CANCEL_IF_PROGRAM_RUNNING
= 1 << 13,
62 CANCEL_ALL_COMMAND
= 1 << 15,
69 INITIALIZE_COMMAND
, /* Debugger stopped */
70 LOAD_COMMAND
, /* Debugger started */
72 QUIT_COMMAND
, /* Debugger started - Program stopped */
75 INSPECT_MEMORY_COMMAND
,
77 LIST_REGISTER_COMMAND
,
78 UNLOAD_COMMAND
, /* Program loaded */
80 RESTART_COMMAND
, /* Program loaded - Program stopped */
82 BREAK_FUNCTION_COMMAND
,
83 BREAK_ADDRESS_COMMAND
,
85 IGNORE_BREAK_COMMAND
, /* 0x10 */
86 CONDITION_BREAK_COMMAND
,
88 INFO_SHAREDLIB_COMMAND
,
92 STEP_IN_COMMAND
, /* Program stopped */
98 HANDLE_SIGNAL_COMMAND
,
104 INFO_SIGNAL_COMMAND
, /* 0x20 */
107 INFO_VARIABLES_COMMAND
,
110 UPDATE_REGISTER_COMMAND
,
111 WRITE_REGISTER_COMMAND
,
117 LIST_VARIABLE_CHILDREN
,
119 ASSIGN_VARIABLE
, /* 0x30 */
121 INTERRUPT_COMMAND
/* Program running */
122 } DmaDebuggerCommandType
;
126 DMA_CALLBACK_COMMAND
=
128 NEED_DEBUGGER_STOPPED
| NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
129 DMA_INITIALIZE_COMMAND
=
130 INITIALIZE_COMMAND
| START_DEBUGGER
|
131 NEED_DEBUGGER_STOPPED
,
133 LOAD_COMMAND
| LOAD_PROGRAM
|
134 NEED_DEBUGGER_STOPPED
| NEED_DEBUGGER_STARTED
,
136 ATTACH_COMMAND
| RUN_PROGRAM
|
137 NEED_DEBUGGER_STOPPED
| NEED_DEBUGGER_STARTED
,
139 QUIT_COMMAND
| CANCEL_ALL_COMMAND
| STOP_DEBUGGER
|
140 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
142 ABORT_COMMAND
| CANCEL_ALL_COMMAND
| STOP_DEBUGGER
|
143 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
146 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
147 DMA_INSPECT_MEMORY_COMMAND
=
148 INSPECT_MEMORY_COMMAND
|
149 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
150 DMA_DISASSEMBLE_COMMAND
=
151 DISASSEMBLE_COMMAND
|
152 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
153 DMA_LIST_REGISTER_COMMAND
=
154 LIST_REGISTER_COMMAND
|
155 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
157 UNLOAD_COMMAND
| START_DEBUGGER
|
158 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
160 START_COMMAND
| RUN_PROGRAM
|
161 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
162 DMA_RESTART_COMMAND
=
163 RESTART_COMMAND
| RUN_PROGRAM
|
164 NEED_PROGRAM_STOPPED
,
165 DMA_BREAK_LINE_COMMAND
=
167 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
168 DMA_BREAK_FUNCTION_COMMAND
=
169 BREAK_FUNCTION_COMMAND
|
170 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
171 DMA_BREAK_ADDRESS_COMMAND
=
172 BREAK_ADDRESS_COMMAND
|
173 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
174 DMA_ENABLE_BREAK_COMMAND
=
175 ENABLE_BREAK_COMMAND
|
176 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
177 DMA_IGNORE_BREAK_COMMAND
=
178 IGNORE_BREAK_COMMAND
|
179 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
180 DMA_CONDITION_BREAK_COMMAND
=
181 CONDITION_BREAK_COMMAND
|
182 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
183 DMA_REMOVE_BREAK_COMMAND
=
184 REMOVE_BREAK_COMMAND
|
185 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
186 DMA_INFO_SHAREDLIB_COMMAND
=
187 INFO_SHAREDLIB_COMMAND
|
188 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
189 DMA_INFO_TARGET_COMMAND
=
190 INFO_TARGET_COMMAND
|
191 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
192 DMA_INFO_PROGRAM_COMMAND
=
193 INFO_PROGRAM_COMMAND
|
194 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
195 DMA_INFO_UDOT_COMMAND
=
197 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
198 DMA_STEP_IN_COMMAND
=
199 STEP_IN_COMMAND
| RUN_PROGRAM
|
200 NEED_PROGRAM_STOPPED
,
201 DMA_STEP_OVER_COMMAND
=
202 STEP_OVER_COMMAND
| RUN_PROGRAM
|
203 NEED_PROGRAM_STOPPED
,
204 DMA_STEP_OUT_COMMAND
=
205 STEP_OUT_COMMAND
| RUN_PROGRAM
|
206 NEED_PROGRAM_STOPPED
,
208 RUN_COMMAND
| RUN_PROGRAM
|
209 NEED_PROGRAM_STOPPED
,
211 RUN_TO_COMMAND
| RUN_PROGRAM
|
212 NEED_PROGRAM_STOPPED
,
214 EXIT_COMMAND
| LOAD_PROGRAM
|
215 NEED_PROGRAM_STOPPED
,
216 DMA_HANDLE_SIGNAL_COMMAND
=
217 HANDLE_SIGNAL_COMMAND
|
218 NEED_PROGRAM_STOPPED
,
219 DMA_LIST_LOCAL_COMMAND
=
221 NEED_PROGRAM_STOPPED
,
222 DMA_LIST_ARG_COMMAND
=
224 NEED_PROGRAM_STOPPED
,
225 DMA_LIST_THREAD_COMMAND
=
226 LIST_THREAD_COMMAND
|
227 NEED_PROGRAM_STOPPED
,
228 DMA_SET_THREAD_COMMAND
=
230 NEED_PROGRAM_STOPPED
,
231 DMA_INFO_THREAD_COMMAND
=
232 INFO_THREAD_COMMAND
|
233 NEED_PROGRAM_STOPPED
,
234 DMA_INFO_SIGNAL_COMMAND
=
235 INFO_SIGNAL_COMMAND
|
236 NEED_PROGRAM_STOPPED
,
237 DMA_INFO_FRAME_COMMAND
=
239 NEED_PROGRAM_STOPPED
,
240 DMA_INFO_ARGS_COMMAND
=
242 NEED_PROGRAM_STOPPED
,
243 DMA_INFO_VARIABLES_COMMAND
=
244 INFO_VARIABLES_COMMAND
|
245 NEED_PROGRAM_STOPPED
,
246 DMA_SET_FRAME_COMMAND
=
248 NEED_PROGRAM_STOPPED
,
249 DMA_LIST_FRAME_COMMAND
=
251 NEED_PROGRAM_STOPPED
,
252 DMA_UPDATE_REGISTER_COMMAND
=
253 UPDATE_REGISTER_COMMAND
|
254 NEED_PROGRAM_STOPPED
,
255 DMA_WRITE_REGISTER_COMMAND
=
256 WRITE_REGISTER_COMMAND
|
257 NEED_PROGRAM_STOPPED
,
258 DMA_EVALUATE_COMMAND
=
260 NEED_PROGRAM_STOPPED
,
261 DMA_INSPECT_COMMAND
=
263 NEED_PROGRAM_STOPPED
,
266 NEED_PROGRAM_STOPPED
,
267 DMA_CREATE_VARIABLE_COMMAND
=
269 NEED_PROGRAM_STOPPED
,
270 DMA_EVALUATE_VARIABLE_COMMAND
=
271 EVALUATE_VARIABLE
| CANCEL_IF_PROGRAM_RUNNING
|
272 NEED_PROGRAM_STOPPED
,
273 DMA_LIST_VARIABLE_CHILDREN_COMMAND
=
274 LIST_VARIABLE_CHILDREN
|
275 NEED_PROGRAM_STOPPED
,
276 DMA_DELETE_VARIABLE_COMMAND
=
278 NEED_PROGRAM_STOPPED
,
279 DMA_ASSIGN_VARIABLE_COMMAND
=
281 NEED_PROGRAM_STOPPED
,
282 DMA_UPDATE_VARIABLE_COMMAND
=
283 UPDATE_VARIABLE
| CANCEL_IF_PROGRAM_RUNNING
|
284 NEED_PROGRAM_STOPPED
,
285 DMA_INTERRUPT_COMMAND
=
286 INTERRUPT_COMMAND
| STOP_PROGRAM
|
287 NEED_PROGRAM_RUNNING
,
288 } DmaDebuggerCommand
;
295 DEBUGGER_STOPPED_OR_GREATER
= EMPTY_COMMAND
,
296 DEBUGGER_STOPPED_OR_LESSER
= INITIALIZE_COMMAND
,
297 DEBUGGER_STARTED_OR_GREATER
= LOAD_COMMAND
,
298 DEBUGGER_STARTED_OR_LESSER
= ATTACH_COMMAND
,
299 PROGRAM_LOADED_OR_GREATER
= UNLOAD_COMMAND
,
300 PROGRAM_LOADED_OR_LESSER
= ATTACH_COMMAND
,
301 PROGRAM_STOPPED_OR_GREATER
= QUIT_COMMAND
,
302 PROGRAM_STOPPED_OR_LESSER
= ATTACH_COMMAND
,
303 PROGRAM_RUNNING_OR_GREATER
= INTERRUPT_COMMAND
,
304 PROGRAM_RUNNING_OR_LESSER
= INTERRUPT_COMMAND
307 typedef struct _DmaQueueCommand
309 DmaDebuggerCommandType type
;
310 IAnjutaDebuggerCallback callback
;
370 struct _DmaQueueCommand
*next
;
373 struct _DmaDebuggerQueue
{
376 AnjutaPlugin
* plugin
;
377 IAnjutaDebugger
* debugger
;
378 IAnjutaCpuDebugger
* cpu_debugger
;
381 DmaQueueCommand
*head
;
382 DmaQueueCommand
*tail
;
383 DmaDebuggerCommandType last
;
384 gboolean queue_command
;
386 IAnjutaDebuggerStatus debugger_status
;
387 IAnjutaDebuggerStatus queue_status
;
388 IAnjutaDebuggerStatus status
;
390 gboolean stop_on_sharedlib
;
392 /* View for debugger messages */
393 IAnjutaMessageView
* log
;
395 /* User output callback */
396 IAnjutaDebuggerOutputCallback output_callback
;
397 gpointer output_data
;
400 struct _DmaDebuggerQueueClass
{
405 * Functions declaration
406 *---------------------------------------------------------------------------*/
409 dma_queue_check_status (DmaDebuggerQueue
*self
, DmaDebuggerCommandType type
, GError
**err
);
412 dma_queue_update_debugger_status (DmaDebuggerQueue
*self
, IAnjutaDebuggerStatus state
, gint status
);
415 *---------------------------------------------------------------------------*/
418 on_debugger_output (IAnjutaDebuggerOutputType type
, const gchar
*message
, gpointer user_data
)
420 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (user_data
);
422 /* Call user call back if exist */
423 if (self
->output_callback
!= NULL
)
425 self
->output_callback (type
, message
, self
->output_data
);
429 /* Default handling of debugger message */
433 case IANJUTA_DEBUGGER_OUTPUT
:
434 dma_debugger_message (self
, message
);
436 case IANJUTA_DEBUGGER_INFO_OUTPUT
:
437 dma_debugger_info (self
, message
);
439 case IANJUTA_DEBUGGER_WARNING_OUTPUT
:
440 dma_debugger_warning (self
, message
);
442 case IANJUTA_DEBUGGER_ERROR_OUTPUT
:
443 dma_debugger_error (self
, message
);
450 *---------------------------------------------------------------------------*/
453 dma_debugger_command_free (DmaQueueCommand
*cmd
)
455 switch (cmd
->type
& COMMAND_MASK
)
458 case CALLBACK_COMMAND
:
459 case INITIALIZE_COMMAND
:
464 case STEP_IN_COMMAND
:
465 case STEP_OVER_COMMAND
:
466 case STEP_OUT_COMMAND
:
467 case RESTART_COMMAND
:
469 case INTERRUPT_COMMAND
:
470 case ENABLE_BREAK_COMMAND
:
471 case IGNORE_BREAK_COMMAND
:
472 case REMOVE_BREAK_COMMAND
:
474 case LIST_LOCAL_COMMAND
:
475 case LIST_ARG_COMMAND
:
476 case INFO_THREAD_COMMAND
:
477 case LIST_THREAD_COMMAND
:
478 case SET_THREAD_COMMAND
:
479 case INFO_SIGNAL_COMMAND
:
480 case INFO_SHAREDLIB_COMMAND
:
481 case INFO_FRAME_COMMAND
:
482 case INFO_ARGS_COMMAND
:
483 case INFO_TARGET_COMMAND
:
484 case INFO_PROGRAM_COMMAND
:
485 case INFO_UDOT_COMMAND
:
486 case INFO_VARIABLES_COMMAND
:
487 case LIST_REGISTER_COMMAND
:
488 case UPDATE_REGISTER_COMMAND
:
490 case SET_FRAME_COMMAND
:
491 case LIST_FRAME_COMMAND
:
492 case INSPECT_MEMORY_COMMAND
:
493 case DISASSEMBLE_COMMAND
:
495 case INSPECT_COMMAND
:
496 case EVALUATE_COMMAND
:
497 case WRITE_REGISTER_COMMAND
:
498 if (cmd
->data
.watch
.name
!= NULL
) g_free (cmd
->data
.watch
.name
);
499 if (cmd
->data
.watch
.value
!= NULL
) g_free (cmd
->data
.watch
.value
);
502 if (cmd
->data
.start
.args
) g_free (cmd
->data
.start
.args
);
505 if (cmd
->data
.load
.file
) g_free (cmd
->data
.load
.file
);
506 if (cmd
->data
.load
.type
) g_free (cmd
->data
.load
.type
);
507 g_list_foreach (cmd
->data
.load
.dirs
, (GFunc
)g_free
, NULL
);
508 g_list_free (cmd
->data
.load
.dirs
);
511 g_list_foreach (cmd
->data
.attach
.dirs
, (GFunc
)g_free
, NULL
);
512 g_list_free (cmd
->data
.attach
.dirs
);
515 case BREAK_LINE_COMMAND
:
516 case BREAK_FUNCTION_COMMAND
:
517 case BREAK_ADDRESS_COMMAND
:
518 if (cmd
->data
.pos
.file
) g_free (cmd
->data
.pos
.file
);
519 if (cmd
->data
.pos
.function
) g_free (cmd
->data
.pos
.function
);
521 case CONDITION_BREAK_COMMAND
:
522 if (cmd
->data
.brk
.condition
) g_free (cmd
->data
.brk
.condition
);
525 if (cmd
->data
.user
.cmd
) g_free (cmd
->data
.user
.cmd
);
528 if (cmd
->data
.print
.var
) g_free (cmd
->data
.print
.var
);
530 case HANDLE_SIGNAL_COMMAND
:
531 if (cmd
->data
.signal
.name
) g_free (cmd
->data
.signal
.name
);
533 case DELETE_VARIABLE
:
534 case ASSIGN_VARIABLE
:
535 case CREATE_VARIABLE
:
536 case EVALUATE_VARIABLE
:
537 case LIST_VARIABLE_CHILDREN
:
538 case UPDATE_VARIABLE
:
539 if (cmd
->data
.var
.name
) g_free (cmd
->data
.var
.name
);
545 dma_debugger_command_cancel (DmaQueueCommand
*cmd
)
547 GError
*err
= g_error_new_literal (IANJUTA_DEBUGGER_ERROR
, IANJUTA_DEBUGGER_CANCEL
, "Command cancel");
549 if (cmd
->callback
!= NULL
)
551 cmd
->callback (NULL
, cmd
->user_data
, err
);
553 g_warning ("Cancel command %x\n", cmd
->type
);
556 dma_debugger_command_free (cmd
);
560 dma_queue_cancel (DmaDebuggerQueue
*self
, guint flag
)
562 DmaQueueCommand
* cmd
;
563 DmaQueueCommand
* prev
= self
->head
;
565 /* Cancel all commands after head */
566 for (cmd
= prev
->next
; cmd
!= NULL
;)
568 if (cmd
->type
& flag
)
570 DmaQueueCommand
* tmp
= cmd
;
573 dma_debugger_command_cancel (tmp
);
586 /* Cancel all commands those cannot handle this unexpected state
587 * Return TRUE if the state of the queue need to be changed too
591 dma_queue_cancel_unexpected (DmaDebuggerQueue
*self
, guint state
)
593 DmaQueueCommand
* cmd
;
594 DmaQueueCommand
* prev
;
596 /* Check if queue is empty */
599 if (self
->ready
== FALSE
)
601 /* Current command is still in queue, keep it */
605 if (prev
->type
& CHANGE_STATE
)
612 /* First command hasn't been send yet, can be cancelled */
619 if (!(cmd
->type
& state
))
621 /* Command is not allowed in this state, cancel it */
622 DmaQueueCommand
* tmp
= cmd
;
625 dma_debugger_command_cancel (tmp
);
635 else if (cmd
->type
& CHANGE_STATE
)
637 /* A command setting the state is kept,
638 debugger state is known again afterward, queue state is kept too */
644 /* Command is allowed even in this unexpected state, keep it */
649 /* Update end of queue if necessary, queue state need to be changed */
658 dma_debugger_queue_remove (DmaDebuggerQueue
*self
)
660 DmaQueueCommand
* cmd
;
662 if (self
->head
!= NULL
)
664 cmd
= self
->head
->next
;
665 dma_debugger_command_free (self
->head
);
671 /* Queue is empty so has the same status than debugger */
672 self
->queue_status
= self
->debugger_status
;
678 dma_debugger_end_command (DmaDebuggerQueue
*self
)
680 if (self
->ready
== FALSE
)
682 dma_debugger_queue_remove (self
);
688 /* Avoid passing a NULL argument to ianjuter_debugger_initialize */
697 dma_queue_check_status (DmaDebuggerQueue
*self
, DmaDebuggerCommandType type
, GError
**err
)
701 switch (self
->queue_command
? self
->queue_status
: self
->debugger_status
)
703 case IANJUTA_DEBUGGER_BUSY
:
704 /* Only the debugger can be busy */
705 g_return_val_if_reached (FALSE
);
706 case IANJUTA_DEBUGGER_STOPPED
:
707 if (type
& NEED_DEBUGGER_STOPPED
)
712 else if (type
& STOP_DEBUGGER
)
714 /* Already stopped */
715 g_warning ("Cancel command %x, already stop\n", type
);
720 /* Other command need a program loaded, cannot be done automatically */
721 g_warning ("Cancel command %x, debugger stopped\n", type
);
724 case IANJUTA_DEBUGGER_STARTED
:
725 if (type
& NEED_DEBUGGER_STARTED
)
730 else if (type
& START_DEBUGGER
)
732 /* Already started */
733 g_warning ("Cancel command %x, already started\n", type
);
738 /* Other command need a program loaded, cannot be done automatically */
739 g_warning ("Cancel command %x, debugger started\n", type
);
742 case IANJUTA_DEBUGGER_PROGRAM_LOADED
:
743 if (type
& NEED_PROGRAM_LOADED
)
750 /* Other command need a program running, cannot be done automatically */
751 g_warning ("Cancel command %x, program loaded\n", type
);
754 case IANJUTA_DEBUGGER_PROGRAM_STOPPED
:
755 if (type
& NEED_PROGRAM_STOPPED
)
762 /* Other command need a program running, cannot be done automatically */
763 g_warning ("Cancel command %x, program stopped\n", type
);
766 case IANJUTA_DEBUGGER_PROGRAM_RUNNING
:
767 if (type
& NEED_PROGRAM_RUNNING
)
774 /* Other command need a program stopped, cannot be done automatically */
775 g_warning ("Cancel command %x, program running\n", type
);
784 dma_queue_update_queue_status (DmaDebuggerQueue
*self
, DmaDebuggerCommandType type
)
786 if (type
& STOP_DEBUGGER
)
788 self
->queue_status
= IANJUTA_DEBUGGER_STOPPED
;
790 else if (type
& START_DEBUGGER
)
792 self
->queue_status
= IANJUTA_DEBUGGER_STARTED
;
794 else if (type
& LOAD_PROGRAM
)
796 self
->queue_status
= IANJUTA_DEBUGGER_PROGRAM_LOADED
;
798 else if (type
& STOP_PROGRAM
)
800 self
->queue_status
= IANJUTA_DEBUGGER_PROGRAM_STOPPED
;
802 else if (type
& RUN_PROGRAM
)
804 self
->queue_status
= IANJUTA_DEBUGGER_PROGRAM_RUNNING
;
805 dma_queue_cancel (self
, CANCEL_IF_PROGRAM_RUNNING
);
810 dma_queue_emit_debugger_ready (DmaDebuggerQueue
*queue
)
812 IAnjutaDebuggerStatus stat
;
813 static gboolean busy
= FALSE
;
815 if ((queue
->head
== NULL
) && (queue
->ready
))
817 stat
= queue
->queue_status
;
822 /* Busy signal already emitted, do nothing */
827 stat
= IANJUTA_DEBUGGER_BUSY
;
831 g_signal_emit_by_name (queue
, "debugger-ready", stat
);
835 dma_queue_update_debugger_status (DmaDebuggerQueue
*self
, IAnjutaDebuggerStatus state
, gint status
)
837 const char* signal
= NULL
;
839 self
->queue_command
= FALSE
;
842 case IANJUTA_DEBUGGER_BUSY
:
843 /* Debugger is busy, nothing to do */
844 self
->queue_command
= TRUE
;
846 case IANJUTA_DEBUGGER_STOPPED
:
847 if (self
->debugger_status
!= IANJUTA_DEBUGGER_STOPPED
)
849 if (!(self
->last
& STOP_DEBUGGER
))
851 if (dma_queue_cancel_unexpected (self
, NEED_DEBUGGER_STOPPED
))
853 self
->queue_status
= IANJUTA_DEBUGGER_STOPPED
;
856 self
->debugger_status
= IANJUTA_DEBUGGER_STOPPED
;
857 signal
= "debugger-stopped";
860 case IANJUTA_DEBUGGER_STARTED
:
861 if (self
->debugger_status
!= IANJUTA_DEBUGGER_STARTED
)
863 if (!(self
->last
& START_DEBUGGER
))
865 if (dma_queue_cancel_unexpected (self
, NEED_DEBUGGER_STARTED
))
867 self
->queue_status
= IANJUTA_DEBUGGER_STARTED
;
870 self
->debugger_status
= IANJUTA_DEBUGGER_STARTED
;
871 signal
= "debugger-started";
874 case IANJUTA_DEBUGGER_PROGRAM_LOADED
:
875 if (self
->debugger_status
!= IANJUTA_DEBUGGER_PROGRAM_LOADED
)
877 if (!(self
->last
& LOAD_PROGRAM
))
879 if (dma_queue_cancel_unexpected (self
, NEED_PROGRAM_LOADED
))
881 self
->queue_status
= IANJUTA_DEBUGGER_PROGRAM_LOADED
;
884 if (self
->debugger_status
== IANJUTA_DEBUGGER_STOPPED
)
886 dma_debugger_end_command (self
);
887 self
->debugger_status
= IANJUTA_DEBUGGER_STARTED
;
888 g_signal_emit_by_name (self
, "debugger-started");
890 self
->debugger_status
= IANJUTA_DEBUGGER_PROGRAM_LOADED
;
891 self
->stop_on_sharedlib
= FALSE
;
892 signal
= "program-loaded";
895 case IANJUTA_DEBUGGER_PROGRAM_STOPPED
:
896 if (self
->debugger_status
!= IANJUTA_DEBUGGER_PROGRAM_STOPPED
)
898 if (!(self
->last
& STOP_PROGRAM
))
900 if (dma_queue_cancel_unexpected (self
, NEED_PROGRAM_STOPPED
))
902 self
->queue_status
= IANJUTA_DEBUGGER_PROGRAM_STOPPED
;
905 self
->debugger_status
= IANJUTA_DEBUGGER_PROGRAM_STOPPED
;
906 if (!self
->stop_on_sharedlib
)
908 signal
= "program-stopped";
912 case IANJUTA_DEBUGGER_PROGRAM_RUNNING
:
913 if (self
->debugger_status
!= IANJUTA_DEBUGGER_PROGRAM_RUNNING
)
915 if (!(self
->last
& RUN_PROGRAM
))
917 if (dma_queue_cancel_unexpected (self
, NEED_PROGRAM_RUNNING
))
919 self
->queue_status
= IANJUTA_DEBUGGER_PROGRAM_RUNNING
;
922 self
->debugger_status
= IANJUTA_DEBUGGER_PROGRAM_RUNNING
;
923 self
->stop_on_sharedlib
= FALSE
;
924 signal
= "program-running";
929 /* Remove current command */
930 dma_debugger_end_command (self
);
935 g_signal_emit_by_name (self
, signal
, status
);
937 self
->queue_command
= TRUE
;
941 dma_debugger_queue_clear (DmaDebuggerQueue
*self
)
943 DmaQueueCommand
* cmd
;
945 for (cmd
= self
->head
; cmd
!= NULL
; )
948 dma_debugger_command_free (self
->head
);
954 self
->queue_command
= TRUE
;
956 /* Queue is empty so has the same status than debugger */
957 self
->queue_status
= self
->debugger_status
;
960 static DmaQueueCommand
*
961 dma_debugger_queue_append (DmaDebuggerQueue
*self
, DmaDebuggerCommandType type
, GError
**err
)
963 DmaQueueCommand
* cmd
= NULL
;
966 if (dma_queue_check_status(self
, type
, err
))
968 cmd
= g_new0 (DmaQueueCommand
, 1);
971 if (self
->queue_command
)
973 // Append command at the end (in the queue)
975 if (self
->head
== NULL
)
982 self
->tail
->next
= cmd
;
986 dma_queue_update_queue_status (self
, type
);
990 // Prepend command at the beginning
993 cmd
->next
= self
->head
;
995 if (self
->tail
== NULL
)
1002 cmd
->next
= self
->head
->next
;
1003 self
->head
->next
= cmd
;
1004 if (self
->tail
== self
->head
)
1016 static DmaQueueCommand
*
1017 dma_debugger_queue_prepend (DmaDebuggerQueue
*self
)
1019 DmaQueueCommand
* cmd
;
1021 cmd
= g_new0 (DmaQueueCommand
, 1);
1022 cmd
->type
= EMPTY_COMMAND
;
1023 cmd
->next
= self
->head
;
1026 if (self
->head
== NULL
)
1028 /* queue is empty */
1037 dma_debugger_queue_execute (DmaDebuggerQueue
*self
)
1039 IAnjutaDebuggerRegister reg
;
1043 /* Check if debugger is connected to a debugger backend */
1044 if (self
->debugger
== NULL
) return;
1046 /* Check if there debugger is busy */
1049 IAnjutaDebuggerStatus status
;
1050 /* Recheck status in case of desynchronization */
1051 status
= ianjuta_debugger_get_status (self
->debugger
, NULL
);
1052 dma_queue_update_debugger_status (self
, status
, 0);
1055 /* Check if there is something to execute */
1056 while ((self
->head
!= NULL
) && (self
->ready
))
1058 DmaQueueCommand
*cmd
;
1062 DEBUG_PRINT("debugger cmd %x status %d\n", cmd
->type
, self
->debugger_status
);
1065 self
->ready
= FALSE
;
1066 self
->last
= cmd
->type
;
1067 switch (cmd
->type
& COMMAND_MASK
)
1071 case CALLBACK_COMMAND
:
1072 ianjuta_debugger_callback (self
->debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1074 case INITIALIZE_COMMAND
:
1075 //dma_debugger_create_view (self);
1076 self
->output_callback
= (IAnjutaDebuggerOutputCallback
)cmd
->callback
;
1077 self
->output_data
= cmd
->user_data
;
1078 ianjuta_debugger_initialize (self
->debugger
, on_debugger_output
, self
, &err
);
1081 ianjuta_debugger_load (self
->debugger
, cmd
->data
.load
.file
, cmd
->data
.load
.type
, cmd
->data
.load
.dirs
, cmd
->data
.load
.terminal
, &err
);
1083 case ATTACH_COMMAND
:
1084 ianjuta_debugger_attach (self
->debugger
, cmd
->data
.attach
.pid
, cmd
->data
.load
.dirs
, &err
);
1086 case UNLOAD_COMMAND
:
1087 ianjuta_debugger_unload (self
->debugger
, &err
);
1090 ret
= ianjuta_debugger_quit (self
->debugger
, &err
);
1093 ianjuta_debugger_abort (self
->debugger
, &err
);
1096 ianjuta_debugger_start (self
->debugger
, cmd
->data
.start
.args
, &err
);
1099 ianjuta_debugger_run (self
->debugger
, &err
);
1101 case RUN_TO_COMMAND
:
1102 ianjuta_debugger_run_to (self
->debugger
, cmd
->data
.pos
.file
, cmd
->data
.pos
.line
, &err
);
1104 case STEP_IN_COMMAND
:
1105 ianjuta_debugger_step_in (self
->debugger
, &err
);
1107 case STEP_OVER_COMMAND
:
1108 ianjuta_debugger_step_over (self
->debugger
, &err
);
1110 case STEP_OUT_COMMAND
:
1111 ianjuta_debugger_step_out (self
->debugger
, &err
);
1113 case RESTART_COMMAND
:
1114 //ianjuta_debugger_restart (self->debugger, &err);
1117 ianjuta_debugger_exit (self
->debugger
, &err
);
1119 case INTERRUPT_COMMAND
:
1120 ianjuta_debugger_interrupt (self
->debugger
, &err
);
1122 case ENABLE_BREAK_COMMAND
:
1123 ianjuta_debugger_enable_breakpoint (self
->debugger
, cmd
->data
.brk
.id
, cmd
->data
.brk
.enable
== IANJUTA_DEBUGGER_YES
? TRUE
: FALSE
, cmd
->callback
, cmd
->user_data
, &err
);
1125 case IGNORE_BREAK_COMMAND
:
1126 ianjuta_debugger_ignore_breakpoint (self
->debugger
, cmd
->data
.brk
.id
, cmd
->data
.brk
.ignore
, cmd
->callback
, cmd
->user_data
, &err
);
1128 case REMOVE_BREAK_COMMAND
:
1129 ianjuta_debugger_clear_breakpoint (self
->debugger
, cmd
->data
.brk
.id
, cmd
->callback
, cmd
->user_data
, &err
);
1131 case INSPECT_COMMAND
:
1132 ianjuta_debugger_inspect (self
->debugger
, cmd
->data
.watch
.name
, cmd
->callback
, cmd
->user_data
, &err
);
1134 case EVALUATE_COMMAND
:
1135 ianjuta_debugger_evaluate (self
->debugger
, cmd
->data
.watch
.name
, cmd
->data
.watch
.value
, cmd
->callback
, cmd
->user_data
, &err
);
1137 case LIST_LOCAL_COMMAND
:
1138 ianjuta_debugger_list_local (self
->debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1140 case LIST_ARG_COMMAND
:
1141 ianjuta_debugger_list_argument (self
->debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1143 case LIST_THREAD_COMMAND
:
1144 ianjuta_debugger_list_thread (self
->debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1146 case SET_THREAD_COMMAND
:
1147 ianjuta_debugger_set_thread (self
->debugger
, cmd
->data
.frame
.frame
, &err
);
1149 case INFO_THREAD_COMMAND
:
1150 ianjuta_debugger_info_thread (self
->debugger
, cmd
->data
.info
.id
, cmd
->callback
, cmd
->user_data
, &err
);
1152 case INFO_SIGNAL_COMMAND
:
1153 ianjuta_debugger_info_signal (self
->debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1155 case INFO_SHAREDLIB_COMMAND
:
1156 ianjuta_debugger_info_sharedlib (self
->debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1158 case INFO_FRAME_COMMAND
:
1159 ianjuta_debugger_info_frame (self
->debugger
, 0, cmd
->callback
, cmd
->user_data
, &err
);
1161 case INFO_ARGS_COMMAND
:
1162 ianjuta_debugger_info_args (self
->debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1164 case INFO_TARGET_COMMAND
:
1165 ianjuta_debugger_info_target (self
->debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1167 case INFO_PROGRAM_COMMAND
:
1168 ianjuta_debugger_info_program (self
->debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1170 case INFO_UDOT_COMMAND
:
1171 ianjuta_debugger_info_udot (self
->debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1173 case INFO_VARIABLES_COMMAND
:
1174 ianjuta_debugger_info_variables (self
->debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1176 case SET_FRAME_COMMAND
:
1177 ianjuta_debugger_set_frame (self
->debugger
, cmd
->data
.frame
.frame
, &err
);
1179 case LIST_FRAME_COMMAND
:
1180 ianjuta_debugger_list_frame (self
->debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1182 case LIST_REGISTER_COMMAND
:
1183 ianjuta_cpu_debugger_list_register (self
->cpu_debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1185 case UPDATE_REGISTER_COMMAND
:
1186 ianjuta_cpu_debugger_update_register (self
->cpu_debugger
, cmd
->callback
, cmd
->user_data
, &err
);
1188 case WRITE_REGISTER_COMMAND
:
1189 reg
.num
= cmd
->data
.watch
.id
;
1190 reg
.name
= cmd
->data
.watch
.name
;
1191 reg
.value
= cmd
->data
.watch
.value
;
1192 ianjuta_cpu_debugger_write_register (self
->cpu_debugger
, ®
, &err
);
1194 case INSPECT_MEMORY_COMMAND
:
1195 ianjuta_cpu_debugger_inspect_memory (self
->cpu_debugger
, cmd
->data
.mem
.address
, cmd
->data
.mem
.length
, cmd
->callback
, cmd
->user_data
, &err
);
1197 case DISASSEMBLE_COMMAND
:
1198 ianjuta_cpu_debugger_disassemble (self
->cpu_debugger
, cmd
->data
.mem
.address
, cmd
->data
.mem
.length
, cmd
->callback
, cmd
->user_data
, &err
);
1200 case BREAK_LINE_COMMAND
:
1201 ianjuta_debugger_set_breakpoint_at_line (self
->debugger
, cmd
->data
.pos
.file
, cmd
->data
.pos
.line
, cmd
->callback
, cmd
->user_data
, &err
);
1203 case BREAK_FUNCTION_COMMAND
:
1204 ianjuta_debugger_set_breakpoint_at_function (self
->debugger
, cmd
->data
.pos
.file
, cmd
->data
.pos
.function
, cmd
->callback
, cmd
->user_data
, &err
);
1206 case BREAK_ADDRESS_COMMAND
:
1207 ianjuta_debugger_set_breakpoint_at_address (self
->debugger
, cmd
->data
.pos
.address
, cmd
->callback
, cmd
->user_data
, &err
);
1209 case CONDITION_BREAK_COMMAND
:
1210 ianjuta_debugger_condition_breakpoint (self
->debugger
, cmd
->data
.brk
.id
, cmd
->data
.brk
.condition
, cmd
->callback
, cmd
->user_data
, &err
);
1213 ianjuta_debugger_send_command (self
->debugger
, cmd
->data
.user
.cmd
, &err
);
1216 ianjuta_debugger_print (self
->debugger
, cmd
->data
.print
.var
, cmd
->callback
, cmd
->user_data
, &err
);
1218 case HANDLE_SIGNAL_COMMAND
:
1219 ianjuta_debugger_handle_signal (self
->debugger
, cmd
->data
.signal
.name
, cmd
->data
.signal
.stop
, cmd
->data
.signal
.print
, cmd
->data
.signal
.ignore
, &err
);
1221 case DELETE_VARIABLE
:
1222 ianjuta_variable_debugger_delete_var (IANJUTA_VARIABLE_DEBUGGER (self
->debugger
), cmd
->data
.var
.name
, NULL
);
1224 case ASSIGN_VARIABLE
:
1225 ianjuta_variable_debugger_assign (IANJUTA_VARIABLE_DEBUGGER (self
->debugger
), cmd
->data
.var
.name
, cmd
->data
.var
.value
, &err
);
1227 case EVALUATE_VARIABLE
:
1228 ianjuta_variable_debugger_evaluate (IANJUTA_VARIABLE_DEBUGGER (self
->debugger
), cmd
->data
.var
.name
, cmd
->callback
, cmd
->user_data
, &err
);
1230 case LIST_VARIABLE_CHILDREN
:
1231 ianjuta_variable_debugger_list_children (IANJUTA_VARIABLE_DEBUGGER (self
->debugger
), cmd
->data
.var
.name
, cmd
->callback
, cmd
->user_data
, &err
);
1233 case CREATE_VARIABLE
:
1234 ianjuta_variable_debugger_create (IANJUTA_VARIABLE_DEBUGGER (self
->debugger
), cmd
->data
.var
.name
, cmd
->callback
, cmd
->user_data
, &err
);
1236 case UPDATE_VARIABLE
:
1237 ianjuta_variable_debugger_update (IANJUTA_VARIABLE_DEBUGGER (self
->debugger
), cmd
->callback
, cmd
->user_data
, &err
);
1243 /* Something fail */
1244 gboolean cancel_state
= cmd
->type
& CHANGE_STATE
;
1246 /* Cancel command */
1247 self
->head
= cmd
->next
;
1248 dma_debugger_command_cancel (cmd
);
1251 /* If a command changing a state has been cancelled,
1252 * cancel invalidate commands too */
1255 /* State change doesn't happen cancel all commands
1256 those cannot handle this */
1257 if (dma_queue_cancel_unexpected (self
, self
->debugger_status
))
1259 self
->queue_status
= self
->debugger_status
;
1266 dma_queue_emit_debugger_ready (self
);
1269 /* Public message functions
1270 *---------------------------------------------------------------------------*/
1273 dma_debugger_message (DmaDebuggerQueue
*self
, const gchar
* message
)
1275 // dma_debugger_print_message (self, IANJUTA_MESSAGE_VIEW_TYPE_NORMAL, message);
1279 dma_debugger_info (DmaDebuggerQueue
*self
, const gchar
* message
)
1281 // dma_debugger_print_message (self, IANJUTA_MESSAGE_VIEW_TYPE_INFO, message);
1284 void dma_debugger_warning (DmaDebuggerQueue
*self
, const gchar
* message
)
1286 // dma_debugger_print_message (self, IANJUTA_MESSAGE_VIEW_TYPE_WARNING, message);
1289 void dma_debugger_error (DmaDebuggerQueue
*self
, const gchar
* message
)
1291 // dma_debugger_print_message (self, IANJUTA_MESSAGE_VIEW_TYPE_ERROR, message);
1294 /* IAnjutaDebugger callback
1295 *---------------------------------------------------------------------------*/
1298 on_dma_debugger_ready (DmaDebuggerQueue
*self
, IAnjutaDebuggerStatus status
)
1300 DEBUG_PRINT ("From debugger: receive debugger ready");
1301 dma_queue_update_debugger_status (self
, status
, 0);
1302 if (self
->ready
) dma_debugger_queue_execute (self
);
1306 on_dma_debugger_started (DmaDebuggerQueue
*self
)
1309 DEBUG_PRINT ("From debugger: receive debugger started");
1310 dma_queue_update_debugger_status (self
, IANJUTA_DEBUGGER_STARTED
, 0);
1311 if (self
->ready
) dma_debugger_queue_execute (self
);
1315 on_dma_debugger_stopped (DmaDebuggerQueue
*self
, gint status
)
1317 DEBUG_PRINT ("From debugger: receive debugger stopped");
1318 dma_queue_update_debugger_status (self
, IANJUTA_DEBUGGER_STOPPED
, status
);
1319 if (self
->ready
) dma_debugger_queue_execute (self
);
1323 on_dma_program_loaded (DmaDebuggerQueue
*self
)
1325 DEBUG_PRINT ("From debugger: receive program loaded");
1326 dma_queue_update_debugger_status (self
, IANJUTA_DEBUGGER_PROGRAM_LOADED
, 0);
1327 if (self
->ready
) dma_debugger_queue_execute (self
);
1331 on_dma_program_running (DmaDebuggerQueue
*self
)
1333 DEBUG_PRINT ("From debugger: debugger_program_running");
1334 dma_queue_update_debugger_status (self
, IANJUTA_DEBUGGER_PROGRAM_RUNNING
, 0);
1338 on_dma_program_stopped (DmaDebuggerQueue
*self
, guint thread
)
1340 DEBUG_PRINT ("From debugger: receive program stopped");
1341 dma_queue_update_debugger_status (self
, IANJUTA_DEBUGGER_PROGRAM_STOPPED
, thread
);
1342 if (self
->ready
) dma_debugger_queue_execute (self
);
1346 on_dma_program_exited (DmaDebuggerQueue
*self
)
1348 DEBUG_PRINT ("From debugger: receive program exited");
1349 dma_queue_update_debugger_status (self
, IANJUTA_DEBUGGER_PROGRAM_LOADED
, 0);
1350 if (self
->ready
) dma_debugger_queue_execute (self
);
1354 on_dma_location_changed (DmaDebuggerQueue
*self
, const gchar
* src_path
, guint line
, guint address
)
1356 DEBUG_PRINT ("From debugger: location changed");
1357 g_signal_emit_by_name (self
, "location-changed", src_path
, line
, address
);
1361 on_dma_frame_changed (DmaDebuggerQueue
*self
, guint frame
, guint thread
)
1363 DEBUG_PRINT ("From debugger: frame changed");
1364 g_signal_emit_by_name (self
, "frame-changed", frame
, thread
);
1368 on_dma_signal_received (DmaDebuggerQueue
*self
, const gchar
* name
, const gchar
* description
)
1370 DEBUG_PRINT ("From debugger: signal received");
1371 g_signal_emit_by_name (self
, "signal-received", name
, description
);
1375 on_dma_sharedlib_event (DmaDebuggerQueue
*self
)
1377 DEBUG_PRINT ("From debugger: shared lib event");
1378 self
->stop_on_sharedlib
= TRUE
;
1379 dma_queue_update_debugger_status (self
, IANJUTA_DEBUGGER_PROGRAM_STOPPED
, 0);
1380 g_signal_emit_by_name (self
, "sharedlib-event");
1381 ianjuta_debugger_run (IANJUTA_DEBUGGER (self
), NULL
);
1384 /* Connect/Disconnect function
1385 *---------------------------------------------------------------------------*/
1388 dma_debugger_activate_plugin (DmaDebuggerQueue
* self
, const gchar
*mime_type
)
1390 AnjutaPluginManager
*plugin_manager
;
1391 AnjutaPluginDescription
*plugin
;
1392 GList
*descs
= NULL
;
1394 gchar
**interface_list
;
1397 /* Get list of debugger plugins */
1398 plugin_manager
= anjuta_shell_get_plugin_manager (ANJUTA_PLUGIN(self
->plugin
)->shell
, NULL
);
1399 descs
= anjuta_plugin_manager_query (plugin_manager
,
1400 "Anjuta Plugin","Interfaces", "IAnjutaDebugger",
1401 "File Loader", "SupportedMimeTypes", mime_type
,
1406 /* No plugin found */
1407 anjuta_util_dialog_error (GTK_WINDOW (ANJUTA_PLUGIN (self
->plugin
)->shell
),
1408 _("Unable to find one debugger plugin acception %s mime type"), mime_type
);
1412 else if (g_list_length (descs
) == 1)
1414 /* Only one plugin found, use it */
1415 plugin
= (AnjutaPluginDescription
*)descs
->data
;
1419 /* Ask the user to select one plugin */
1420 plugin
= anjuta_plugin_manager_select (plugin_manager
,
1421 _("Select a plugin"),
1422 _("Please select a plugin to activate"),
1428 /* No plugin selected */
1433 /* Get debugger location */
1435 anjuta_plugin_description_get_string (plugin
, "Anjuta Plugin", "Location", &value
);
1436 g_return_val_if_fail (value
!= NULL
, FALSE
);
1438 /* Get debugger interface */
1439 self
->debugger
= (IAnjutaDebugger
*)anjuta_plugin_manager_get_plugin_by_id (plugin_manager
, value
);
1442 /* Get cpu debugger interface if available */
1443 if (IANJUTA_IS_CPU_DEBUGGER (self
->debugger
))
1445 self
->cpu_debugger
= IANJUTA_CPU_DEBUGGER (self
->debugger
);
1452 dma_debugger_disconnect (DmaDebuggerQueue
*self
)
1454 /* Disconnect signal */
1457 g_signal_handlers_disconnect_by_func (self
->debugger
, G_CALLBACK (on_dma_debugger_ready
), self
);
1458 g_signal_handlers_disconnect_by_func (self
->debugger
, G_CALLBACK (on_dma_debugger_started
), self
);
1459 g_signal_handlers_disconnect_by_func (self
->debugger
, G_CALLBACK (on_dma_debugger_stopped
), self
);
1460 g_signal_handlers_disconnect_by_func (self
->debugger
, G_CALLBACK (on_dma_program_loaded
), self
);
1461 g_signal_handlers_disconnect_by_func (self
->debugger
, G_CALLBACK (on_dma_program_running
), self
);
1462 g_signal_handlers_disconnect_by_func (self
->debugger
, G_CALLBACK (on_dma_program_stopped
), self
);
1463 g_signal_handlers_disconnect_by_func (self
->debugger
, G_CALLBACK (on_dma_program_exited
), self
);
1464 g_signal_handlers_disconnect_by_func (self
->debugger
, G_CALLBACK (on_dma_location_changed
), self
);
1465 g_signal_handlers_disconnect_by_func (self
->debugger
, G_CALLBACK (on_dma_sharedlib_event
), self
);
1466 self
->debugger
= NULL
;
1471 dma_debugger_connect (DmaDebuggerQueue
*self
, const gchar
*mime_type
)
1473 dma_debugger_disconnect (self
);
1475 /* Look for a debugger supporting mime_type */
1476 if (!dma_debugger_activate_plugin (self
, mime_type
))
1485 /* Connect signal */
1486 g_signal_connect_swapped (self
->debugger
, "debugger-ready", G_CALLBACK (on_dma_debugger_ready
), self
);
1487 g_signal_connect_swapped (self
->debugger
, "debugger-started", G_CALLBACK (on_dma_debugger_started
), self
);
1488 g_signal_connect_swapped (self
->debugger
, "debugger-stopped", G_CALLBACK (on_dma_debugger_stopped
), self
);
1489 g_signal_connect_swapped (self
->debugger
, "program-loaded", G_CALLBACK (on_dma_program_loaded
), self
);
1490 g_signal_connect_swapped (self
->debugger
, "program-running", G_CALLBACK (on_dma_program_running
), self
);
1491 g_signal_connect_swapped (self
->debugger
, "program-stopped", G_CALLBACK (on_dma_program_stopped
), self
);
1492 g_signal_connect_swapped (self
->debugger
, "program-exited", G_CALLBACK (on_dma_program_exited
), self
);
1493 g_signal_connect_swapped (self
->debugger
, "location-changed", G_CALLBACK (on_dma_location_changed
), self
);
1494 g_signal_connect_swapped (self
->debugger
, "signal-received", G_CALLBACK (on_dma_signal_received
), self
);
1495 g_signal_connect_swapped (self
->debugger
, "frame-changed", G_CALLBACK (on_dma_frame_changed
), self
);
1496 g_signal_connect_swapped (self
->debugger
, "sharedlib-event", G_CALLBACK (on_dma_sharedlib_event
), self
);
1498 if (self
->log
== NULL
)
1500 ianjuta_debugger_disable_log (self
->debugger
, NULL
);
1504 ianjuta_debugger_enable_log (self
->debugger
, self
->log
, NULL
);
1508 return self
->debugger
!= NULL
;
1511 /* Implementation of IAnjutaDebugger interface
1512 *---------------------------------------------------------------------------*/
1514 static IAnjutaDebuggerStatus
1515 idebugger_get_status (IAnjutaDebugger
*iface
, GError
**err
)
1517 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1519 return self
->queue_status
;
1523 idebugger_initialize (IAnjutaDebugger
*iface
, IAnjutaDebuggerOutputCallback callback
, gpointer user_data
, GError
**err
)
1525 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1526 DmaQueueCommand
*cmd
;
1528 cmd
= dma_debugger_queue_append (self
, DMA_INITIALIZE_COMMAND
, err
);
1529 if (cmd
== NULL
) return FALSE
;
1531 cmd
->callback
= (IAnjutaDebuggerCallback
)callback
;
1532 cmd
->user_data
= user_data
;
1533 dma_debugger_queue_execute (self
);
1539 idebugger_load (IAnjutaDebugger
*iface
, const gchar
*file
, const gchar
* mime_type
,
1540 const GList
*search_dirs
, gboolean terminal
, GError
**err
)
1542 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1543 DmaQueueCommand
*cmd
;
1546 if (!dma_debugger_connect (self
, mime_type
)) return FALSE
;
1548 cmd
= dma_debugger_queue_append (self
, DMA_LOAD_COMMAND
, err
);
1549 if (cmd
== NULL
) return FALSE
;
1551 cmd
->data
.load
.file
= g_strdup (file
);
1552 cmd
->data
.load
.type
= g_strdup (mime_type
);
1553 cmd
->data
.load
.dirs
= NULL
;
1554 cmd
->data
.load
.terminal
= terminal
;
1555 for (node
= search_dirs
; node
!= NULL
; node
= g_list_next (node
))
1557 cmd
->data
.load
.dirs
= g_list_prepend (cmd
->data
.load
.dirs
, g_strdup (node
->data
));
1559 cmd
->data
.load
.dirs
= g_list_reverse (cmd
->data
.load
.dirs
);
1561 dma_debugger_queue_execute (self
);
1567 idebugger_attach (IAnjutaDebugger
*iface
, pid_t pid
, const GList
*search_dirs
, GError
**err
)
1569 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1570 DmaQueueCommand
*cmd
;
1573 if (!dma_debugger_connect (self
, NULL
)) return FALSE
;
1575 cmd
= dma_debugger_queue_append (self
, DMA_ATTACH_COMMAND
, err
);
1576 if (cmd
== NULL
) return FALSE
;
1578 cmd
->data
.attach
.pid
= pid
;
1579 cmd
->data
.attach
.dirs
= NULL
;
1580 for (node
= search_dirs
; node
!= NULL
; node
= g_list_next (node
))
1582 cmd
->data
.attach
.dirs
= g_list_prepend (cmd
->data
.attach
.dirs
, g_strdup (node
->data
));
1584 cmd
->data
.attach
.dirs
= g_list_reverse (cmd
->data
.attach
.dirs
);
1586 dma_debugger_queue_execute (self
);
1592 idebugger_start (IAnjutaDebugger
*iface
, const gchar
*args
, GError
**err
)
1594 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1595 DmaQueueCommand
*cmd
;
1597 cmd
= dma_debugger_queue_append (self
, DMA_START_COMMAND
, err
);
1598 if (cmd
== NULL
) return FALSE
;
1600 cmd
->data
.start
.args
= args
== NULL
? NULL
: g_strdup (args
);
1601 dma_debugger_queue_execute (self
);
1607 idebugger_unload (IAnjutaDebugger
*iface
, GError
**err
)
1609 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1610 DmaQueueCommand
*cmd
;
1612 cmd
= dma_debugger_queue_append (self
, DMA_UNLOAD_COMMAND
, err
);
1613 if (cmd
== NULL
) return FALSE
;
1615 dma_debugger_queue_execute (self
);
1621 idebugger_quit (IAnjutaDebugger
*iface
, GError
**err
)
1623 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1624 DmaQueueCommand
*cmd
;
1626 cmd
= dma_debugger_queue_append (self
, DMA_QUIT_COMMAND
, err
);
1627 if (cmd
== NULL
) return FALSE
;
1629 dma_debugger_queue_execute (self
);
1635 idebugger_abort (IAnjutaDebugger
*iface
, GError
**err
)
1637 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1638 DmaQueueCommand
*cmd
;
1640 cmd
= dma_debugger_queue_append (self
, DMA_ABORT_COMMAND
, err
);
1641 if (cmd
== NULL
) return FALSE
;
1643 dma_debugger_queue_execute (self
);
1649 idebugger_run (IAnjutaDebugger
*iface
, GError
**err
)
1651 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1652 DmaQueueCommand
*cmd
;
1654 cmd
= dma_debugger_queue_append (self
, DMA_RUN_COMMAND
, err
);
1655 if (cmd
== NULL
) return FALSE
;
1657 dma_debugger_queue_execute (self
);
1663 idebugger_step_in (IAnjutaDebugger
*iface
, GError
**err
)
1665 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1666 DmaQueueCommand
*cmd
;
1668 cmd
= dma_debugger_queue_append (self
, DMA_STEP_IN_COMMAND
, err
);
1669 if (cmd
== NULL
) return FALSE
;
1671 dma_debugger_queue_execute (self
);
1677 idebugger_step_over (IAnjutaDebugger
*iface
, GError
**err
)
1679 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1680 DmaQueueCommand
*cmd
;
1682 cmd
= dma_debugger_queue_append (self
, DMA_STEP_OVER_COMMAND
, err
);
1683 if (cmd
== NULL
) return FALSE
;
1685 dma_debugger_queue_execute (self
);
1691 idebugger_run_to (IAnjutaDebugger
*iface
, const gchar
*file
,
1692 gint line
, GError
**err
)
1694 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1695 DmaQueueCommand
*cmd
;
1697 cmd
= dma_debugger_queue_append (self
, DMA_RUN_TO_COMMAND
, err
);
1698 if (cmd
== NULL
) return FALSE
;
1700 cmd
->data
.pos
.file
= g_strdup (file
);
1701 cmd
->data
.pos
.line
= line
;
1702 dma_debugger_queue_execute (self
);
1708 idebugger_step_out (IAnjutaDebugger
*iface
, GError
**err
)
1710 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1711 DmaQueueCommand
*cmd
;
1713 cmd
= dma_debugger_queue_append (self
, DMA_STEP_OUT_COMMAND
, err
);
1714 if (cmd
== NULL
) return FALSE
;
1716 dma_debugger_queue_execute (self
);
1722 idebugger_exit (IAnjutaDebugger
*iface
, GError
**err
)
1724 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1725 DmaQueueCommand
*cmd
;
1727 cmd
= dma_debugger_queue_append (self
, DMA_EXIT_COMMAND
, err
);
1728 if (cmd
== NULL
) return FALSE
;
1730 dma_debugger_queue_execute (self
);
1736 idebugger_interrupt (IAnjutaDebugger
*iface
, GError
**err
)
1738 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1739 DmaQueueCommand
*cmd
;
1741 cmd
= dma_debugger_queue_append (self
, DMA_INTERRUPT_COMMAND
, err
);
1742 if (cmd
== NULL
) return FALSE
;
1744 dma_debugger_queue_execute (self
);
1750 idebugger_add_breakpoint_at_line (IAnjutaDebugger
*iface
, const gchar
* file
, guint line
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
1752 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1753 DmaQueueCommand
*cmd
;
1755 cmd
= dma_debugger_queue_append (self
, DMA_BREAK_LINE_COMMAND
, err
);
1756 if (cmd
== NULL
) return FALSE
;
1758 cmd
->data
.pos
.file
= g_strdup (file
);
1759 cmd
->data
.pos
.line
= line
;
1760 cmd
->callback
= callback
;
1761 cmd
->user_data
= user_data
;
1762 dma_debugger_queue_execute (self
);
1768 idebugger_add_breakpoint_at_function (IAnjutaDebugger
*iface
, const gchar
* file
, const gchar
* function
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
1770 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1771 DmaQueueCommand
*cmd
;
1773 cmd
= dma_debugger_queue_append (self
, DMA_BREAK_FUNCTION_COMMAND
, err
);
1774 if (cmd
== NULL
) return FALSE
;
1776 cmd
->data
.pos
.file
= g_strdup (file
);
1777 cmd
->data
.pos
.function
= g_strdup (function
);
1778 cmd
->callback
= callback
;
1779 cmd
->user_data
= user_data
;
1780 dma_debugger_queue_execute (self
);
1786 idebugger_add_breakpoint_at_address (IAnjutaDebugger
*iface
, guint address
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
1788 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1789 DmaQueueCommand
*cmd
;
1791 cmd
= dma_debugger_queue_append (self
, DMA_BREAK_ADDRESS_COMMAND
, err
);
1792 if (cmd
== NULL
) return FALSE
;
1794 cmd
->data
.pos
.address
= address
;
1795 cmd
->callback
= callback
;
1796 cmd
->user_data
= user_data
;
1797 dma_debugger_queue_execute (self
);
1803 idebugger_enable_breakpoint (IAnjutaDebugger
*iface
, guint id
, gboolean enable
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
1805 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1806 DmaQueueCommand
*cmd
;
1808 cmd
= dma_debugger_queue_append (self
, DMA_ENABLE_BREAK_COMMAND
, err
);
1809 if (cmd
== NULL
) return FALSE
;
1811 cmd
->data
.brk
.id
= id
;
1812 cmd
->data
.brk
.enable
= enable
;
1813 cmd
->callback
= callback
;
1814 cmd
->user_data
= user_data
;
1815 dma_debugger_queue_execute (self
);
1821 idebugger_ignore_breakpoint (IAnjutaDebugger
*iface
, guint id
, guint ignore
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
1823 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1824 DmaQueueCommand
*cmd
;
1826 cmd
= dma_debugger_queue_append (self
, DMA_IGNORE_BREAK_COMMAND
, err
);
1827 if (cmd
== NULL
) return FALSE
;
1829 cmd
->data
.brk
.id
= id
;
1830 cmd
->data
.brk
.ignore
= ignore
;
1831 cmd
->callback
= callback
;
1832 cmd
->user_data
= user_data
;
1833 dma_debugger_queue_execute (self
);
1839 idebugger_condition_breakpoint (IAnjutaDebugger
*iface
, guint id
, const gchar
*condition
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
1841 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1842 DmaQueueCommand
*cmd
;
1844 cmd
= dma_debugger_queue_append (self
, DMA_CONDITION_BREAK_COMMAND
, err
);
1845 if (cmd
== NULL
) return FALSE
;
1847 cmd
->data
.brk
.id
= id
;
1848 cmd
->data
.brk
.condition
= g_strdup (condition
);
1849 cmd
->callback
= callback
;
1850 cmd
->user_data
= user_data
;
1851 dma_debugger_queue_execute (self
);
1857 idebugger_remove_breakpoint (IAnjutaDebugger
*iface
, guint id
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
1859 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1860 DmaQueueCommand
*cmd
;
1862 cmd
= dma_debugger_queue_append (self
, DMA_REMOVE_BREAK_COMMAND
, err
);
1863 if (cmd
== NULL
) return FALSE
;
1865 cmd
->data
.brk
.id
= id
;
1866 cmd
->callback
= callback
;
1867 cmd
->user_data
= user_data
;
1868 dma_debugger_queue_execute (self
);
1874 idebugger_inspect (IAnjutaDebugger
*iface
, const gchar
*expression
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
1876 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1877 DmaQueueCommand
*cmd
;
1879 cmd
= dma_debugger_queue_append (self
, DMA_INSPECT_COMMAND
, err
);
1880 if (cmd
== NULL
) return FALSE
;
1882 cmd
->data
.watch
.name
= g_strdup (expression
);
1883 cmd
->callback
= callback
;
1884 cmd
->user_data
= user_data
;
1885 dma_debugger_queue_execute (self
);
1891 idebugger_evaluate (IAnjutaDebugger
*iface
, const gchar
*name
, const gchar
* value
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
1893 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1894 DmaQueueCommand
*cmd
;
1896 cmd
= dma_debugger_queue_append (self
, DMA_EVALUATE_COMMAND
, err
);
1897 if (cmd
== NULL
) return FALSE
;
1899 cmd
->data
.watch
.name
= g_strdup (name
);
1900 cmd
->data
.watch
.value
= g_strdup (value
);
1901 cmd
->callback
= callback
;
1902 cmd
->user_data
= user_data
;
1903 dma_debugger_queue_execute (self
);
1909 idebugger_send_command (IAnjutaDebugger
*iface
, const gchar
* command
, GError
**err
)
1911 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1912 DmaQueueCommand
*cmd
;
1914 cmd
= dma_debugger_queue_append (self
, DMA_USER_COMMAND
, err
);
1915 if (cmd
== NULL
) return FALSE
;
1917 cmd
->data
.user
.cmd
= g_strdup (command
);
1918 dma_debugger_queue_execute (self
);
1924 idebugger_print (IAnjutaDebugger
*iface
, const gchar
* variable
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
1926 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1927 DmaQueueCommand
*cmd
;
1929 cmd
= dma_debugger_queue_append (self
, DMA_PRINT_COMMAND
, err
);
1930 if (cmd
== NULL
) return FALSE
;
1932 cmd
->data
.print
.var
= g_strdup (variable
);
1933 cmd
->callback
= callback
;
1934 cmd
->user_data
= user_data
;
1935 dma_debugger_queue_execute (self
);
1941 idebugger_list_local (IAnjutaDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
1943 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1944 DmaQueueCommand
*cmd
;
1946 cmd
= dma_debugger_queue_append (self
, DMA_LIST_LOCAL_COMMAND
, err
);
1947 if (cmd
== NULL
) return FALSE
;
1949 cmd
->callback
= callback
;
1950 cmd
->user_data
= user_data
;
1951 dma_debugger_queue_execute (self
);
1957 idebugger_list_argument (IAnjutaDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
1959 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1960 DmaQueueCommand
*cmd
;
1962 cmd
= dma_debugger_queue_append (self
, DMA_LIST_ARG_COMMAND
, err
);
1963 if (cmd
== NULL
) return FALSE
;
1965 cmd
->callback
= callback
;
1966 cmd
->user_data
= user_data
;
1967 dma_debugger_queue_execute (self
);
1973 idebugger_list_thread (IAnjutaDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
1975 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1976 DmaQueueCommand
*cmd
;
1978 cmd
= dma_debugger_queue_append (self
, DMA_LIST_THREAD_COMMAND
, err
);
1979 if (cmd
== NULL
) return FALSE
;
1981 cmd
->callback
= callback
;
1982 cmd
->user_data
= user_data
;
1983 dma_debugger_queue_execute (self
);
1989 idebugger_set_thread (IAnjutaDebugger
*iface
, guint thread
, GError
**err
)
1991 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
1992 DmaQueueCommand
*cmd
;
1994 cmd
= dma_debugger_queue_append (self
, DMA_SET_THREAD_COMMAND
, err
);
1995 if (cmd
== NULL
) return FALSE
;
1997 cmd
->data
.frame
.frame
= thread
;
1998 dma_debugger_queue_execute (self
);
2004 idebugger_info_thread (IAnjutaDebugger
*iface
, guint thread
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2006 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2007 DmaQueueCommand
*cmd
;
2009 cmd
= dma_debugger_queue_append (self
, DMA_INFO_THREAD_COMMAND
, err
);
2010 if (cmd
== NULL
) return FALSE
;
2012 cmd
->callback
= callback
;
2013 cmd
->user_data
= user_data
;
2014 cmd
->data
.info
.id
= thread
;
2015 dma_debugger_queue_execute (self
);
2021 idebugger_info_signal (IAnjutaDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2023 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2024 DmaQueueCommand
*cmd
;
2026 cmd
= dma_debugger_queue_append (self
, DMA_INFO_SIGNAL_COMMAND
, err
);
2027 if (cmd
== NULL
) return FALSE
;
2029 cmd
->callback
= callback
;
2030 cmd
->user_data
= user_data
;
2031 dma_debugger_queue_execute (self
);
2037 idebugger_info_sharedlib (IAnjutaDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2039 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2040 DmaQueueCommand
*cmd
;
2042 cmd
= dma_debugger_queue_append (self
, DMA_INFO_SHAREDLIB_COMMAND
, err
);
2043 if (cmd
== NULL
) return FALSE
;
2045 cmd
->callback
= callback
;
2046 cmd
->user_data
= user_data
;
2047 dma_debugger_queue_execute (self
);
2053 idebugger_handle_signal (IAnjutaDebugger
*iface
, const gchar
* name
, gboolean stop
, gboolean print
, gboolean ignore
, GError
**err
)
2055 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2056 DmaQueueCommand
*cmd
;
2058 cmd
= dma_debugger_queue_append (self
, DMA_HANDLE_SIGNAL_COMMAND
, err
);
2059 if (cmd
== NULL
) return FALSE
;
2061 cmd
->data
.signal
.name
= g_strdup (name
);
2062 cmd
->data
.signal
.stop
= stop
;
2063 cmd
->data
.signal
.print
= print
;
2064 cmd
->data
.signal
.ignore
= ignore
;
2065 dma_debugger_queue_execute (self
);
2071 idebugger_info_frame (IAnjutaDebugger
*iface
, guint frame
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2073 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2074 DmaQueueCommand
*cmd
;
2076 cmd
= dma_debugger_queue_append (self
, DMA_INFO_FRAME_COMMAND
, err
);
2077 if (cmd
== NULL
) return FALSE
;
2079 cmd
->data
.frame
.frame
= frame
;
2080 cmd
->callback
= callback
;
2081 cmd
->user_data
= user_data
;
2082 dma_debugger_queue_execute (self
);
2088 idebugger_info_args (IAnjutaDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2090 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2091 DmaQueueCommand
*cmd
;
2093 cmd
= dma_debugger_queue_append (self
, DMA_INFO_ARGS_COMMAND
, err
);
2094 if (cmd
== NULL
) return FALSE
;
2096 cmd
->callback
= callback
;
2097 cmd
->user_data
= user_data
;
2098 dma_debugger_queue_execute (self
);
2104 idebugger_info_target (IAnjutaDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2106 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2107 DmaQueueCommand
*cmd
;
2109 cmd
= dma_debugger_queue_append (self
, DMA_INFO_TARGET_COMMAND
, err
);
2110 if (cmd
== NULL
) return FALSE
;
2112 cmd
->callback
= callback
;
2113 cmd
->user_data
= user_data
;
2114 dma_debugger_queue_execute (self
);
2120 idebugger_info_program (IAnjutaDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2122 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2123 DmaQueueCommand
*cmd
;
2125 cmd
= dma_debugger_queue_append (self
, DMA_INFO_PROGRAM_COMMAND
, err
);
2126 if (cmd
== NULL
) return FALSE
;
2128 cmd
->callback
= callback
;
2129 cmd
->user_data
= user_data
;
2130 dma_debugger_queue_execute (self
);
2136 idebugger_info_udot (IAnjutaDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2138 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2139 DmaQueueCommand
*cmd
;
2141 cmd
= dma_debugger_queue_append (self
, DMA_INFO_UDOT_COMMAND
, err
);
2142 if (cmd
== NULL
) return FALSE
;
2144 cmd
->callback
= callback
;
2145 cmd
->user_data
= user_data
;
2146 dma_debugger_queue_execute (self
);
2152 idebugger_info_variables (IAnjutaDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2154 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2155 DmaQueueCommand
*cmd
;
2157 cmd
= dma_debugger_queue_append (self
, DMA_INFO_VARIABLES_COMMAND
, err
);
2158 if (cmd
== NULL
) return FALSE
;
2160 cmd
->callback
= callback
;
2161 cmd
->user_data
= user_data
;
2162 dma_debugger_queue_execute (self
);
2168 idebugger_set_frame (IAnjutaDebugger
*iface
, guint frame
, GError
**err
)
2170 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2171 DmaQueueCommand
*cmd
;
2173 cmd
= dma_debugger_queue_append (self
, DMA_SET_FRAME_COMMAND
, err
);
2174 if (cmd
== NULL
) return FALSE
;
2176 cmd
->data
.frame
.frame
= frame
;
2177 dma_debugger_queue_execute (self
);
2183 idebugger_list_frame (IAnjutaDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2185 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2186 DmaQueueCommand
*cmd
;
2188 cmd
= dma_debugger_queue_append (self
, DMA_LIST_FRAME_COMMAND
, err
);
2189 if (cmd
== NULL
) return FALSE
;
2191 cmd
->callback
= callback
;
2192 cmd
->user_data
= user_data
;
2193 dma_debugger_queue_execute (self
);
2199 idebugger_list_register (IAnjutaDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2201 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2202 DmaQueueCommand
*cmd
;
2204 cmd
= dma_debugger_queue_append (self
, DMA_LIST_REGISTER_COMMAND
, err
);
2205 if (cmd
== NULL
) return FALSE
;
2207 cmd
->callback
= callback
;
2208 cmd
->user_data
= user_data
;
2209 dma_debugger_queue_execute (self
);
2215 idebugger_callback (IAnjutaDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2217 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2218 DmaQueueCommand
*cmd
;
2220 cmd
= dma_debugger_queue_append (self
, DMA_CALLBACK_COMMAND
, err
);
2221 if (cmd
== NULL
) return FALSE
;
2223 cmd
->callback
= callback
;
2224 cmd
->user_data
= user_data
;
2225 dma_debugger_queue_execute (self
);
2231 idebugger_enable_log (IAnjutaDebugger
*iface
, IAnjutaMessageView
*log
, GError
**err
)
2233 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2236 if (self
->debugger
!= NULL
)
2238 ianjuta_debugger_enable_log (self
->debugger
, self
->log
, err
);
2243 idebugger_disable_log (IAnjutaDebugger
*iface
, GError
**err
)
2245 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2248 if (self
->debugger
!= NULL
)
2250 ianjuta_debugger_disable_log (self
->debugger
, err
);
2255 idebugger_iface_init (IAnjutaDebuggerIface
*iface
)
2257 iface
->get_status
= idebugger_get_status
;
2258 iface
->initialize
= idebugger_initialize
;
2259 iface
->attach
= idebugger_attach
;
2260 iface
->load
= idebugger_load
;
2261 iface
->start
= idebugger_start
;
2262 iface
->unload
= idebugger_unload
;
2263 iface
->quit
= idebugger_quit
;
2264 iface
->abort
= idebugger_abort
;
2265 iface
->run
= idebugger_run
;
2266 iface
->step_in
= idebugger_step_in
;
2267 iface
->step_over
= idebugger_step_over
;
2268 iface
->step_out
= idebugger_step_out
;
2269 iface
->run_to
= idebugger_run_to
;
2270 // iface->restart = idebugger_restart;
2271 iface
->exit
= idebugger_exit
;
2272 iface
->interrupt
= idebugger_interrupt
;
2273 iface
->set_breakpoint_at_line
= idebugger_add_breakpoint_at_line
;
2274 iface
->clear_breakpoint
= idebugger_remove_breakpoint
;
2275 iface
->set_breakpoint_at_address
= idebugger_add_breakpoint_at_address
;
2276 iface
->set_breakpoint_at_function
= idebugger_add_breakpoint_at_function
;
2277 iface
->enable_breakpoint
= idebugger_enable_breakpoint
;
2278 iface
->ignore_breakpoint
= idebugger_ignore_breakpoint
;
2279 iface
->condition_breakpoint
= idebugger_condition_breakpoint
;
2281 iface
->inspect
= idebugger_inspect
;
2282 iface
->evaluate
= idebugger_evaluate
;
2284 iface
->print
= idebugger_print
;
2285 iface
->list_local
= idebugger_list_local
;
2286 iface
->list_argument
= idebugger_list_argument
;
2287 iface
->info_frame
= idebugger_info_frame
;
2288 iface
->info_signal
= idebugger_info_signal
;
2289 iface
->info_sharedlib
= idebugger_info_sharedlib
;
2290 iface
->info_args
= idebugger_info_args
;
2291 iface
->info_target
= idebugger_info_target
;
2292 iface
->info_program
= idebugger_info_program
;
2293 iface
->info_udot
= idebugger_info_udot
;
2294 iface
->info_variables
= idebugger_info_variables
;
2295 iface
->handle_signal
= idebugger_handle_signal
;
2296 iface
->list_frame
= idebugger_list_frame
;
2297 iface
->set_frame
= idebugger_set_frame
;
2298 iface
->list_thread
= idebugger_list_thread
;
2299 iface
->set_thread
= idebugger_set_thread
;
2300 iface
->info_thread
= idebugger_info_thread
;
2301 iface
->list_register
= idebugger_list_register
;
2302 iface
->callback
= idebugger_callback
;
2304 iface
->enable_log
= idebugger_enable_log
;
2305 iface
->disable_log
= idebugger_disable_log
;
2307 iface
->send_command
= idebugger_send_command
;
2311 /* Implementation of IAnjutaCpuDebugger interface
2312 *---------------------------------------------------------------------------*/
2315 icpu_debugger_list_register (IAnjutaCpuDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2317 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2318 DmaQueueCommand
*cmd
;
2320 cmd
= dma_debugger_queue_append (self
, DMA_LIST_REGISTER_COMMAND
, err
);
2321 if (cmd
== NULL
) return FALSE
;
2323 cmd
->callback
= callback
;
2324 cmd
->user_data
= user_data
;
2325 dma_debugger_queue_execute (self
);
2332 icpu_debugger_update_register (IAnjutaCpuDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2334 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2335 DmaQueueCommand
*cmd
;
2337 cmd
= dma_debugger_queue_append (self
, DMA_UPDATE_REGISTER_COMMAND
, err
);
2338 if (cmd
== NULL
) return FALSE
;
2340 cmd
->callback
= callback
;
2341 cmd
->user_data
= user_data
;
2342 dma_debugger_queue_execute (self
);
2348 icpu_debugger_write_register (IAnjutaCpuDebugger
*iface
, IAnjutaDebuggerRegister
*value
, GError
**err
)
2350 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2351 DmaQueueCommand
*cmd
;
2353 cmd
= dma_debugger_queue_append (self
, DMA_WRITE_REGISTER_COMMAND
, err
);
2354 if (cmd
== NULL
) return FALSE
;
2356 cmd
->data
.watch
.id
= value
->num
;
2357 cmd
->data
.watch
.name
= value
->name
!= NULL
? g_strdup (value
->name
) : NULL
;
2358 cmd
->data
.watch
.value
= value
->value
!= NULL
? g_strdup (value
->value
) : NULL
;
2359 dma_debugger_queue_execute (self
);
2365 icpu_debugger_inspect_memory (IAnjutaCpuDebugger
*iface
, guint address
, guint length
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2367 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2368 DmaQueueCommand
*cmd
;
2370 cmd
= dma_debugger_queue_append (self
, DMA_INSPECT_MEMORY_COMMAND
, err
);
2371 if (cmd
== NULL
) return FALSE
;
2373 cmd
->data
.mem
.address
= address
;
2374 cmd
->data
.mem
.length
= length
;
2375 cmd
->callback
= callback
;
2376 cmd
->user_data
= user_data
;
2377 dma_debugger_queue_execute (self
);
2383 icpu_debugger_disassemble (IAnjutaCpuDebugger
*iface
, guint address
, guint length
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2385 DmaDebuggerQueue
*self
= (DmaDebuggerQueue
*)iface
;
2386 DmaQueueCommand
*cmd
;
2388 cmd
= dma_debugger_queue_append (self
, DMA_DISASSEMBLE_COMMAND
, err
);
2389 if (cmd
== NULL
) return FALSE
;
2391 cmd
->data
.mem
.address
= address
;
2392 cmd
->data
.mem
.length
= length
;
2393 cmd
->callback
= callback
;
2394 cmd
->user_data
= user_data
;
2395 dma_debugger_queue_execute (self
);
2401 icpu_debugger_iface_init (IAnjutaCpuDebuggerIface
*iface
)
2403 iface
->list_register
= icpu_debugger_list_register
;
2404 iface
->update_register
= icpu_debugger_update_register
;
2405 iface
->write_register
= icpu_debugger_write_register
;
2406 iface
->inspect_memory
= icpu_debugger_inspect_memory
;
2407 iface
->disassemble
= icpu_debugger_disassemble
;
2410 /* Implementation of IAnjutaVariableDebugger interface
2411 *---------------------------------------------------------------------------*/
2414 ivariable_debugger_delete (IAnjutaVariableDebugger
*iface
, const gchar
*name
, GError
**err
)
2416 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2417 DmaQueueCommand
*cmd
;
2419 cmd
= dma_debugger_queue_append (self
, DMA_DELETE_VARIABLE_COMMAND
, err
);
2420 if (cmd
== NULL
) return FALSE
;
2422 cmd
->data
.var
.name
= g_strdup(name
);
2423 dma_debugger_queue_execute (self
);
2429 ivariable_debugger_evaluate (IAnjutaVariableDebugger
*iface
, const gchar
*name
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2431 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2432 DmaQueueCommand
*cmd
;
2434 cmd
= dma_debugger_queue_append (self
, DMA_EVALUATE_VARIABLE_COMMAND
, err
);
2435 if (cmd
== NULL
) return FALSE
;
2437 cmd
->data
.var
.name
= g_strdup(name
);
2438 cmd
->callback
= callback
;
2439 cmd
->user_data
= user_data
;
2440 dma_debugger_queue_execute (self
);
2446 ivariable_debugger_assign (IAnjutaVariableDebugger
*iface
, const gchar
*name
, const gchar
*value
, GError
**err
)
2448 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2449 DmaQueueCommand
*cmd
;
2451 cmd
= dma_debugger_queue_append (self
, DMA_ASSIGN_VARIABLE_COMMAND
, err
);
2452 if (cmd
== NULL
) return FALSE
;
2454 cmd
->data
.var
.name
= g_strdup(name
);
2455 cmd
->data
.var
.value
= g_strdup(value
);
2456 dma_debugger_queue_execute (self
);
2462 ivariable_debugger_list_children (IAnjutaVariableDebugger
*iface
, const gchar
*name
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2464 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2465 DmaQueueCommand
*cmd
;
2467 cmd
= dma_debugger_queue_append (self
, DMA_LIST_VARIABLE_CHILDREN_COMMAND
, err
);
2468 if (cmd
== NULL
) return FALSE
;
2470 cmd
->data
.var
.name
= g_strdup(name
);
2471 cmd
->callback
= callback
;
2472 cmd
->user_data
= user_data
;
2473 dma_debugger_queue_execute (self
);
2479 ivariable_debugger_create (IAnjutaVariableDebugger
*iface
, const gchar
*name
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2481 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2482 DmaQueueCommand
*cmd
;
2484 cmd
= dma_debugger_queue_append (self
, DMA_CREATE_VARIABLE_COMMAND
, err
);
2485 if (cmd
== NULL
) return FALSE
;
2487 cmd
->data
.var
.name
= g_strdup(name
);
2488 cmd
->callback
= callback
;
2489 cmd
->user_data
= user_data
;
2490 dma_debugger_queue_execute (self
);
2496 ivariable_debugger_update (IAnjutaVariableDebugger
*iface
, IAnjutaDebuggerCallback callback
, gpointer user_data
, GError
**err
)
2498 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (iface
);
2499 DmaQueueCommand
*cmd
;
2501 cmd
= dma_debugger_queue_append (self
, DMA_UPDATE_VARIABLE_COMMAND
, err
);
2502 if (cmd
== NULL
) return FALSE
;
2504 cmd
->callback
= callback
;
2505 cmd
->user_data
= user_data
;
2506 dma_debugger_queue_execute (self
);
2512 ivariable_debugger_iface_init (IAnjutaVariableDebuggerIface
*iface
)
2514 iface
->delete_var
= ivariable_debugger_delete
;
2515 iface
->evaluate
= ivariable_debugger_evaluate
;
2516 iface
->assign
= ivariable_debugger_assign
;
2517 iface
->list_children
= ivariable_debugger_list_children
;
2518 iface
->create
= ivariable_debugger_create
;
2519 iface
->update
= ivariable_debugger_update
;
2522 /* GObject functions
2523 *---------------------------------------------------------------------------*/
2525 /* Used in dispose and finalize */
2526 static gpointer parent_class
;
2528 /* dispose is the first destruction step. It is used to unref object created
2529 * with instance_init in order to break reference counting cycles. This
2530 * function could be called several times. All function should still work
2531 * after this call. It has to called its parents.*/
2534 dma_debugger_queue_dispose (GObject
*obj
)
2536 DmaDebuggerQueue
*self
= DMA_DEBUGGER_QUEUE (obj
);
2538 dma_debugger_queue_clear (self
);
2540 GNOME_CALL_PARENT (G_OBJECT_CLASS
, dispose
, (obj
));
2543 /* finalize is the last destruction step. It must free all memory allocated
2544 * with instance_init. It is called only one time just before releasing all
2548 dma_debugger_queue_finalize (GObject
*obj
)
2550 /*DmaDebuggerQueue *self = DMA_DEBUGGER_QUEUE (obj);*/
2552 GNOME_CALL_PARENT (G_OBJECT_CLASS
, finalize
, (obj
));
2555 /* instance_init is the constructor. All functions should work after this
2559 dma_debugger_queue_instance_init (DmaDebuggerQueue
*self
)
2561 self
->plugin
= NULL
;
2562 self
->debugger
= NULL
;
2563 self
->cpu_debugger
= NULL
;
2565 self
->queue_command
= TRUE
;
2567 self
->debugger_status
= IANJUTA_DEBUGGER_STOPPED
;
2568 self
->queue_status
= IANJUTA_DEBUGGER_STOPPED
;
2569 self
->status
= IANJUTA_DEBUGGER_STOPPED
;
2571 self
->output_callback
= NULL
;
2574 /* class_init intialize the class itself not the instance */
2577 dma_debugger_queue_class_init (DmaDebuggerQueueClass
* klass
)
2579 GObjectClass
*object_class
;
2581 g_return_if_fail (klass
!= NULL
);
2582 object_class
= G_OBJECT_CLASS (klass
);
2584 parent_class
= g_type_class_peek_parent (klass
);
2586 object_class
->dispose
= dma_debugger_queue_dispose
;
2587 object_class
->finalize
= dma_debugger_queue_finalize
;
2591 dma_debugger_queue_get_type (void)
2593 static GType type
= 0;
2597 static const GTypeInfo type_info
=
2599 sizeof (DmaDebuggerQueueClass
),
2600 (GBaseInitFunc
) NULL
,
2601 (GBaseFinalizeFunc
) NULL
,
2602 (GClassInitFunc
) dma_debugger_queue_class_init
,
2603 (GClassFinalizeFunc
) NULL
,
2604 NULL
, /* class_data */
2605 sizeof (DmaDebuggerQueue
),
2606 0, /* n_preallocs */
2607 (GInstanceInitFunc
) dma_debugger_queue_instance_init
,
2608 NULL
/* value_table */
2610 static const GInterfaceInfo iface_debugger_info
= {
2611 (GInterfaceInitFunc
) idebugger_iface_init
,
2612 NULL
, /* interface_finalize */
2613 NULL
/* interface_data */
2615 static const GInterfaceInfo iface_cpu_debugger_info
= {
2616 (GInterfaceInitFunc
) icpu_debugger_iface_init
,
2617 NULL
, /* interface_finalize */
2618 NULL
/* interface_data */
2620 static const GInterfaceInfo iface_variable_debugger_info
= {
2621 (GInterfaceInitFunc
) ivariable_debugger_iface_init
,
2622 NULL
, /* interface_finalize */
2623 NULL
/* interface_data */
2626 type
= g_type_register_static (G_TYPE_OBJECT
,
2627 "DmaDebuggerQueue", &type_info
, 0);
2629 g_type_add_interface_static (type
, IANJUTA_TYPE_DEBUGGER
,
2630 &iface_debugger_info
);
2631 g_type_add_interface_static (type
, IANJUTA_TYPE_CPU_DEBUGGER
,
2632 &iface_cpu_debugger_info
);
2633 g_type_add_interface_static (type
, IANJUTA_TYPE_VARIABLE_DEBUGGER
,
2634 &iface_variable_debugger_info
);
2640 /* Creation and Destruction
2641 *---------------------------------------------------------------------------*/
2644 dma_debugger_queue_new (AnjutaPlugin
*plugin
)
2646 DmaDebuggerQueue
*self
;
2648 self
= g_object_new (DMA_DEBUGGER_QUEUE_TYPE
, NULL
);
2650 self
->plugin
= plugin
;
2656 dma_debugger_queue_free (DmaDebuggerQueue
*self
)
2658 dma_debugger_disconnect (self
);
2659 g_object_unref (self
);