(defvar gdb-frame-number nil
"Selected frame level for main current thread.
-Reset whenever current thread changes.")
+Updated according to the following rules:
+
+When a thread is selected or current thread stops, set to \"0\".
+
+When current thread goes running (and possibly exits eventually),
+set to nil.
+
+May be manually changed by user with `gdb-select-frame'.")
;; Used to show overlay arrow in source buffer. All set in
;; gdb-get-main-selected-frame. Disassembly buffer should not use
(gdb-current-context-command command t))
command))
-;; TODO Document this. We use noarg when not in gud-def
-(defun gdb-gud-context-call (cmd1 &optional cmd2 noall noarg)
- (gud-call
- (concat
- (gdb-gud-context-command cmd1 noall)
- cmd2) (when (not noarg) 'arg)))
+(defmacro gdb-gud-context-call (cmd1 &optional cmd2 noall noarg)
+ "`gud-call' wrapper which adds --thread/--all options between
+CMD1 and CMD2. NOALL is the same as in `gdb-gud-context-command'.
+
+NOARG must be t when this macro is used outside `gud-def'"
+ `(gud-call
+ (concat
+ (gdb-gud-context-command ,cmd1 ,noall)
+ ,cmd2) ,(when (not noarg) 'arg)))
;;;###autoload
(defun gdb (command-line)
(gdb-update-gud-running))
(defun gdb-update-gud-running ()
- "Set `gud-running' and `gdb-frame-number' according to the state
-of current thread.
+ "Set `gud-running' according to the state of current thread.
-`gdb-frame-number' is set to nil if new current thread is
-running.
+`gdb-frame-number' is set to 0 if current thread is now stopped.
Note that when `gdb-gud-control-all-threads' is t, `gud-running'
cannot be reliably used to determine whether or not execution
(setq gud-running
(string= (gdb-get-field (gdb-current-buffer-thread) 'state)
"running"))
- ;; We change frame number only if the state of current thread has
- ;; changed or there's no current thread.
- (when (not (eq gud-running old-value))
- (if (or gud-running (not (gdb-current-buffer-thread)))
- (setq gdb-frame-number nil)
- (setq gdb-frame-number "0")))))
+ ;; Set frame number to "0" when _current_ threads stops
+ (when (and (gdb-current-buffer-thread)
+ (not (eq gud-running old-value)))
+ (setq gdb-frame-number "0"))))
(defun gdb-show-run-p ()
"Return t if \"Run/continue\" should be shown on the toolbar."
(defun gdb-thread-created (output-field))
(defun gdb-thread-exited (output-field)
"Handle =thread-exited async record: unset `gdb-thread-number'
-if current thread exited and update threads list."
+ if current thread exited and update threads list."
(let* ((thread-id (gdb-get-field (gdb-json-string output-field) 'id)))
(if (string= gdb-thread-number thread-id)
(gdb-setq-thread-number nil))
(and (eq gud-minor-mode 'gdbmi)
(> (car (window-fringes)) 0)))))
-(declare-function gdb-gud-context-call "gdb-mi.el")
+(declare-function gdb-gud-context-command "gdb-mi.el")
(defun gud-stop-subjob ()
(interactive)
((eq gud-minor-mode 'jdb)
(gud-call "suspend"))
((eq gud-minor-mode 'gdbmi)
- (gdb-gud-context-call "-exec-interrupt" nil nil t))
+ (gud-call (gdb-gud-context-command "-exec-interrupt")))
(t
(comint-interrupt-subjob)))))