Fix accessing a method's fields from Python
[deliverable/binutils-gdb.git] / gdb / thread.c
CommitLineData
c906108c 1/* Multi-process/thread control for GDB, the GNU debugger.
8926118c 2
b811d2c2 3 Copyright (C) 1986-2020 Free Software Foundation, Inc.
8926118c 4
b6ba6518 5 Contributed by Lynx Real-Time Systems, Inc. Los Gatos, CA.
c906108c 6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
c5aa993b 12 (at your option) any later version.
c906108c 13
c5aa993b
JM
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
c906108c 18
c5aa993b 19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22#include "defs.h"
23#include "symtab.h"
24#include "frame.h"
25#include "inferior.h"
268a13a5 26#include "gdbsupport/environ.h"
c906108c
SS
27#include "value.h"
28#include "target.h"
29#include "gdbthread.h"
30#include "command.h"
31#include "gdbcmd.h"
4e052eda 32#include "regcache.h"
02d27625 33#include "btrace.h"
c906108c
SS
34
35#include <ctype.h>
36#include <sys/types.h>
37#include <signal.h>
8b93c638 38#include "ui-out.h"
76727919 39#include "observable.h"
d4fc5b1e 40#include "annotate.h"
94cc34af 41#include "cli/cli-decode.h"
6665660a 42#include "cli/cli-option.h"
60f98dde 43#include "gdb_regex.h"
aea5b279 44#include "cli/cli-utils.h"
243a9253 45#include "thread-fsm.h"
5d5658a1 46#include "tid-parse.h"
c6609450 47#include <algorithm>
268a13a5 48#include "gdbsupport/gdb_optional.h"
08036331 49#include "inline-frame.h"
5d707134 50#include "stack.h"
94cc34af 51
c378eb4e 52/* Definition of struct thread_info exported to gdbthread.h. */
c906108c 53
c378eb4e 54/* Prototypes for local functions. */
c906108c 55
c906108c
SS
56static int highest_thread_num;
57
3922b302
PA
58/* The current/selected thread. */
59static thread_info *current_thread_;
60
3922b302
PA
61/* Returns true if THR is the current thread. */
62
63static bool
64is_current_thread (const thread_info *thr)
65{
66 return thr == current_thread_;
67}
054e8d9e 68
a5321aa4 69struct thread_info*
4e1c45ea 70inferior_thread (void)
8601f500 71{
3922b302
PA
72 gdb_assert (current_thread_ != nullptr);
73 return current_thread_;
4e1c45ea 74}
8601f500 75
5b834a0a
PA
76/* Delete the breakpoint pointed at by BP_P, if there's one. */
77
78static void
79delete_thread_breakpoint (struct breakpoint **bp_p)
4e1c45ea 80{
5b834a0a 81 if (*bp_p != NULL)
8601f500 82 {
5b834a0a
PA
83 delete_breakpoint (*bp_p);
84 *bp_p = NULL;
8601f500
MS
85 }
86}
87
5b834a0a
PA
88void
89delete_step_resume_breakpoint (struct thread_info *tp)
90{
91 if (tp != NULL)
92 delete_thread_breakpoint (&tp->control.step_resume_breakpoint);
93}
94
186c406b
TT
95void
96delete_exception_resume_breakpoint (struct thread_info *tp)
97{
5b834a0a
PA
98 if (tp != NULL)
99 delete_thread_breakpoint (&tp->control.exception_resume_breakpoint);
100}
101
34b7e8a6
PA
102/* See gdbthread.h. */
103
104void
105delete_single_step_breakpoints (struct thread_info *tp)
106{
107 if (tp != NULL)
108 delete_thread_breakpoint (&tp->control.single_step_breakpoints);
109}
110
5b834a0a
PA
111/* Delete the breakpoint pointed at by BP_P at the next stop, if
112 there's one. */
113
114static void
115delete_at_next_stop (struct breakpoint **bp)
116{
117 if (*bp != NULL)
186c406b 118 {
5b834a0a
PA
119 (*bp)->disposition = disp_del_at_next_stop;
120 *bp = NULL;
186c406b
TT
121 }
122}
123
34b7e8a6
PA
124/* See gdbthread.h. */
125
126int
127thread_has_single_step_breakpoints_set (struct thread_info *tp)
128{
129 return tp->control.single_step_breakpoints != NULL;
130}
131
132/* See gdbthread.h. */
133
134int
135thread_has_single_step_breakpoint_here (struct thread_info *tp,
accd0bcd 136 const address_space *aspace,
34b7e8a6
PA
137 CORE_ADDR addr)
138{
139 struct breakpoint *ss_bps = tp->control.single_step_breakpoints;
140
141 return (ss_bps != NULL
142 && breakpoint_has_location_inserted_here (ss_bps, aspace, addr));
143}
144
243a9253
PA
145/* See gdbthread.h. */
146
147void
148thread_cancel_execution_command (struct thread_info *thr)
149{
150 if (thr->thread_fsm != NULL)
151 {
46e3ed7f
TT
152 thr->thread_fsm->clean_up (thr);
153 delete thr->thread_fsm;
243a9253
PA
154 thr->thread_fsm = NULL;
155 }
156}
157
7c952b6d 158static void
4f8d22e3 159clear_thread_inferior_resources (struct thread_info *tp)
7c952b6d
ND
160{
161 /* NOTE: this will take care of any left-over step_resume breakpoints,
4d8453a5
DJ
162 but not any user-specified thread-specific breakpoints. We can not
163 delete the breakpoint straight-off, because the inferior might not
164 be stopped at the moment. */
5b834a0a
PA
165 delete_at_next_stop (&tp->control.step_resume_breakpoint);
166 delete_at_next_stop (&tp->control.exception_resume_breakpoint);
34b7e8a6 167 delete_at_next_stop (&tp->control.single_step_breakpoints);
186c406b 168
5d5658a1 169 delete_longjmp_breakpoint_at_next_stop (tp->global_num);
f59f708a 170
16c381f0 171 bpstat_clear (&tp->control.stop_bpstat);
95e54da7 172
02d27625
MM
173 btrace_teardown (tp);
174
243a9253 175 thread_cancel_execution_command (tp);
08036331 176
5b6d1e4f 177 clear_inline_frame_state (tp);
4f8d22e3
PA
178}
179
803bdfe4
YQ
180/* Set the TP's state as exited. */
181
182static void
3922b302 183set_thread_exited (thread_info *tp, bool silent)
803bdfe4 184{
28d5518b 185 /* Dead threads don't need to step-over. Remove from chain. */
803bdfe4 186 if (tp->step_over_next != NULL)
28d5518b 187 global_thread_step_over_chain_remove (tp);
803bdfe4
YQ
188
189 if (tp->state != THREAD_EXITED)
190 {
76727919 191 gdb::observers::thread_exit.notify (tp, silent);
803bdfe4
YQ
192
193 /* Tag it as exited. */
194 tp->state = THREAD_EXITED;
195
196 /* Clear breakpoints, etc. associated with this thread. */
197 clear_thread_inferior_resources (tp);
198 }
199}
200
c906108c 201void
fba45db2 202init_thread_list (void)
c906108c 203{
7c952b6d 204 highest_thread_num = 0;
8ea051c5 205
08036331 206 for (thread_info *tp : all_threads_safe ())
c906108c 207 {
08036331
PA
208 inferior *inf = tp->inf;
209
803bdfe4
YQ
210 if (tp->deletable ())
211 delete tp;
212 else
213 set_thread_exited (tp, 1);
c906108c 214
08036331
PA
215 inf->thread_list = NULL;
216 }
c906108c
SS
217}
218
5d5658a1
PA
219/* Allocate a new thread of inferior INF with target id PTID and add
220 it to the thread list. */
e58b0e63
PA
221
222static struct thread_info *
5d5658a1 223new_thread (struct inferior *inf, ptid_t ptid)
e58b0e63 224{
12316564 225 thread_info *tp = new thread_info (inf, ptid);
b05b1202 226
08036331
PA
227 if (inf->thread_list == NULL)
228 inf->thread_list = tp;
b05b1202
PA
229 else
230 {
231 struct thread_info *last;
232
08036331 233 for (last = inf->thread_list; last->next != NULL; last = last->next)
3922b302
PA
234 gdb_assert (ptid != last->ptid
235 || last->state == THREAD_EXITED);
236
237 gdb_assert (ptid != last->ptid
238 || last->state == THREAD_EXITED);
239
b05b1202
PA
240 last->next = tp;
241 }
e58b0e63 242
e58b0e63
PA
243 return tp;
244}
245
0d06e24b 246struct thread_info *
5b6d1e4f 247add_thread_silent (process_stratum_target *targ, ptid_t ptid)
c906108c 248{
3922b302 249 inferior *inf = find_inferior_ptid (targ, ptid);
5b6d1e4f 250
3922b302
PA
251 /* We may have an old thread with the same id in the thread list.
252 If we do, it must be dead, otherwise we wouldn't be adding a new
253 thread with the same id. The OS is reusing this id --- delete
254 the old thread, and create a new one. */
255 thread_info *tp = find_thread_ptid (inf, ptid);
256 if (tp != nullptr)
257 delete_thread (tp);
4f8d22e3 258
5d5658a1 259 tp = new_thread (inf, ptid);
76727919 260 gdb::observers::new_thread.notify (tp);
cfc01461 261
0d06e24b 262 return tp;
c906108c
SS
263}
264
93815fbf 265struct thread_info *
5b6d1e4f
PA
266add_thread_with_info (process_stratum_target *targ, ptid_t ptid,
267 private_thread_info *priv)
93815fbf 268{
5b6d1e4f 269 thread_info *result = add_thread_silent (targ, ptid);
93815fbf 270
7aabaf9d 271 result->priv.reset (priv);
17faa917 272
93815fbf 273 if (print_thread_events)
a068643d 274 printf_unfiltered (_("[New %s]\n"), target_pid_to_str (ptid).c_str ());
d4fc5b1e
NR
275
276 annotate_new_thread ();
93815fbf
VP
277 return result;
278}
279
17faa917 280struct thread_info *
5b6d1e4f 281add_thread (process_stratum_target *targ, ptid_t ptid)
17faa917 282{
5b6d1e4f 283 return add_thread_with_info (targ, ptid, NULL);
17faa917
DJ
284}
285
7aabaf9d
SM
286private_thread_info::~private_thread_info () = default;
287
12316564
YQ
288thread_info::thread_info (struct inferior *inf_, ptid_t ptid_)
289 : ptid (ptid_), inf (inf_)
290{
291 gdb_assert (inf_ != NULL);
292
293 this->global_num = ++highest_thread_num;
294 this->per_inf_num = ++inf_->highest_thread_num;
295
296 /* Nothing to follow yet. */
297 memset (&this->pending_follow, 0, sizeof (this->pending_follow));
298 this->pending_follow.kind = TARGET_WAITKIND_SPURIOUS;
299 this->suspend.waitstatus.kind = TARGET_WAITKIND_IGNORE;
300}
301
302thread_info::~thread_info ()
303{
12316564
YQ
304 xfree (this->name);
305}
306
08036331
PA
307/* See gdbthread.h. */
308
309bool
310thread_info::deletable () const
311{
312 /* If this is the current thread, or there's code out there that
313 relies on it existing (refcount > 0) we can't delete yet. */
5b6d1e4f 314 return refcount () == 0 && !is_current_thread (this);
08036331
PA
315}
316
c2829269
PA
317/* Add TP to the end of the step-over chain LIST_P. */
318
319static void
320step_over_chain_enqueue (struct thread_info **list_p, struct thread_info *tp)
321{
322 gdb_assert (tp->step_over_next == NULL);
323 gdb_assert (tp->step_over_prev == NULL);
324
325 if (*list_p == NULL)
326 {
327 *list_p = tp;
328 tp->step_over_prev = tp->step_over_next = tp;
329 }
330 else
331 {
332 struct thread_info *head = *list_p;
333 struct thread_info *tail = head->step_over_prev;
334
335 tp->step_over_prev = tail;
336 tp->step_over_next = head;
337 head->step_over_prev = tp;
338 tail->step_over_next = tp;
339 }
340}
341
187b041e 342/* See gdbthread.h. */
c2829269 343
187b041e
SM
344void
345thread_step_over_chain_remove (thread_info **list_p, thread_info *tp)
c2829269
PA
346{
347 gdb_assert (tp->step_over_next != NULL);
348 gdb_assert (tp->step_over_prev != NULL);
349
350 if (*list_p == tp)
351 {
352 if (tp == tp->step_over_next)
353 *list_p = NULL;
354 else
355 *list_p = tp->step_over_next;
356 }
357
358 tp->step_over_prev->step_over_next = tp->step_over_next;
359 tp->step_over_next->step_over_prev = tp->step_over_prev;
360 tp->step_over_prev = tp->step_over_next = NULL;
361}
362
363/* See gdbthread.h. */
364
187b041e
SM
365thread_info *
366thread_step_over_chain_next (thread_info *chain_head, thread_info *tp)
367{
368 thread_info *next = tp->step_over_next;
369
370 return next == chain_head ? NULL : next;
371}
372
373/* See gdbthread.h. */
374
c2829269 375struct thread_info *
28d5518b 376global_thread_step_over_chain_next (struct thread_info *tp)
c2829269 377{
187b041e 378 return thread_step_over_chain_next (global_thread_step_over_chain_head, tp);
c2829269
PA
379}
380
381/* See gdbthread.h. */
382
383int
384thread_is_in_step_over_chain (struct thread_info *tp)
385{
386 return (tp->step_over_next != NULL);
387}
388
389/* See gdbthread.h. */
390
187b041e
SM
391int
392thread_step_over_chain_length (thread_info *tp)
393{
394 if (tp == nullptr)
395 return 0;
396
397 gdb_assert (thread_is_in_step_over_chain (tp));
398
399 int num = 1;
400
401 for (thread_info *iter = tp->step_over_next;
402 iter != tp;
403 iter = iter->step_over_next)
404 ++num;
405
406 return num;
407}
408
409/* See gdbthread.h. */
410
c2829269 411void
28d5518b 412global_thread_step_over_chain_enqueue (struct thread_info *tp)
c2829269 413{
187b041e
SM
414 infrun_debug_printf ("enqueueing thread %s in global step over chain",
415 target_pid_to_str (tp->ptid).c_str ());
416
28d5518b 417 step_over_chain_enqueue (&global_thread_step_over_chain_head, tp);
c2829269
PA
418}
419
420/* See gdbthread.h. */
421
187b041e
SM
422void
423global_thread_step_over_chain_enqueue_chain (thread_info *chain_head)
424{
425 gdb_assert (chain_head->step_over_next != nullptr);
426 gdb_assert (chain_head->step_over_prev != nullptr);
427
428 if (global_thread_step_over_chain_head == nullptr)
429 global_thread_step_over_chain_head = chain_head;
430 else
431 {
432 thread_info *global_last = global_thread_step_over_chain_head->step_over_prev;
433 thread_info *chain_last = chain_head->step_over_prev;
434
435 chain_last->step_over_next = global_thread_step_over_chain_head;
436 global_last->step_over_next = chain_head;
437 global_thread_step_over_chain_head->step_over_prev = chain_last;
438 chain_head->step_over_prev = global_last;
439 }
440}
441
442/* See gdbthread.h. */
443
c2829269 444void
28d5518b 445global_thread_step_over_chain_remove (struct thread_info *tp)
c2829269 446{
187b041e
SM
447 infrun_debug_printf ("removing thread %s from global step over chain",
448 target_pid_to_str (tp->ptid).c_str ());
449
28d5518b 450 thread_step_over_chain_remove (&global_thread_step_over_chain_head, tp);
c2829269
PA
451}
452
85102364 453/* Delete the thread referenced by THR. If SILENT, don't notify
2eab46b1
JB
454 the observer of this exit.
455
456 THR must not be NULL or a failed assertion will be raised. */
00431a78 457
5e0b29c1 458static void
00431a78 459delete_thread_1 (thread_info *thr, bool silent)
c906108c 460{
2eab46b1 461 gdb_assert (thr != nullptr);
c906108c 462
2eab46b1 463 struct thread_info *tp, *tpprev = NULL;
c906108c 464
08036331 465 for (tp = thr->inf->thread_list; tp; tpprev = tp, tp = tp->next)
00431a78 466 if (tp == thr)
c906108c
SS
467 break;
468
469 if (!tp)
470 return;
471
803bdfe4 472 set_thread_exited (tp, silent);
c2829269 473
803bdfe4 474 if (!tp->deletable ())
8c25b497 475 {
4f8d22e3
PA
476 /* Will be really deleted some other time. */
477 return;
478 }
479
c906108c
SS
480 if (tpprev)
481 tpprev->next = tp->next;
482 else
08036331 483 tp->inf->thread_list = tp->next;
c906108c 484
12316564 485 delete tp;
c906108c
SS
486}
487
3922b302 488/* See gdbthread.h. */
00431a78 489
5e0b29c1 490void
00431a78 491delete_thread (thread_info *thread)
5e0b29c1 492{
00431a78 493 delete_thread_1 (thread, false /* not silent */);
5e0b29c1
PA
494}
495
496void
00431a78 497delete_thread_silent (thread_info *thread)
5e0b29c1 498{
00431a78 499 delete_thread_1 (thread, true /* silent */);
5e0b29c1
PA
500}
501
1e92afda 502struct thread_info *
5d5658a1 503find_thread_global_id (int global_id)
c906108c 504{
08036331 505 for (thread_info *tp : all_threads ())
5d5658a1
PA
506 if (tp->global_num == global_id)
507 return tp;
508
509 return NULL;
510}
511
512static struct thread_info *
513find_thread_id (struct inferior *inf, int thr_num)
514{
08036331
PA
515 for (thread_info *tp : inf->threads ())
516 if (tp->per_inf_num == thr_num)
c906108c
SS
517 return tp;
518
519 return NULL;
520}
521
5b6d1e4f 522/* See gdbthread.h. */
e04ee09e 523
0d06e24b 524struct thread_info *
5b6d1e4f 525find_thread_ptid (process_stratum_target *targ, ptid_t ptid)
0d06e24b 526{
5b6d1e4f 527 inferior *inf = find_inferior_ptid (targ, ptid);
08036331
PA
528 if (inf == NULL)
529 return NULL;
530 return find_thread_ptid (inf, ptid);
531}
0d06e24b 532
08036331
PA
533/* See gdbthread.h. */
534
535struct thread_info *
536find_thread_ptid (inferior *inf, ptid_t ptid)
537{
3922b302 538 for (thread_info *tp : inf->non_exited_threads ())
9295a5a9 539 if (tp->ptid == ptid)
0d06e24b
JM
540 return tp;
541
542 return NULL;
543}
544
e04ee09e
KB
545/* See gdbthread.h. */
546
547struct thread_info *
50a82723
KB
548find_thread_by_handle (gdb::array_view<const gdb_byte> handle,
549 struct inferior *inf)
e04ee09e 550{
50a82723
KB
551 return target_thread_handle_to_thread_info (handle.data (),
552 handle.size (),
553 inf);
e04ee09e
KB
554}
555
0d06e24b
JM
556/*
557 * Thread iterator function.
558 *
559 * Calls a callback function once for each thread, so long as
560 * the callback function returns false. If the callback function
561 * returns true, the iteration will end and the current thread
ae0eee42 562 * will be returned. This can be useful for implementing a
0d06e24b
JM
563 * search for a thread with arbitrary attributes, or for applying
564 * some operation to every thread.
565 *
ae0eee42 566 * FIXME: some of the existing functionality, such as
0d06e24b
JM
567 * "Thread apply all", might be rewritten using this functionality.
568 */
569
570struct thread_info *
fd118b61
KB
571iterate_over_threads (int (*callback) (struct thread_info *, void *),
572 void *data)
0d06e24b 573{
08036331
PA
574 for (thread_info *tp : all_threads_safe ())
575 if ((*callback) (tp, data))
576 return tp;
0d06e24b
JM
577
578 return NULL;
579}
580
08036331
PA
581/* See gdbthread.h. */
582
583bool
584any_thread_p ()
585{
586 for (thread_info *tp ATTRIBUTE_UNUSED : all_threads ())
587 return true;
588 return false;
589}
590
20874c92 591int
5b6d1e4f 592thread_count (process_stratum_target *proc_target)
20874c92 593{
5b6d1e4f 594 auto rng = all_threads (proc_target);
08036331 595 return std::distance (rng.begin (), rng.end ());
20874c92
VP
596}
597
c6609450
PA
598/* Return the number of non-exited threads in the thread list. */
599
600static int
601live_threads_count (void)
602{
08036331
PA
603 auto rng = all_non_exited_threads ();
604 return std::distance (rng.begin (), rng.end ());
c6609450
PA
605}
606
c906108c 607int
5d5658a1 608valid_global_thread_id (int global_id)
c906108c 609{
08036331 610 for (thread_info *tp : all_threads ())
5d5658a1 611 if (tp->global_num == global_id)
c906108c
SS
612 return 1;
613
614 return 0;
615}
616
5b6d1e4f
PA
617bool
618in_thread_list (process_stratum_target *targ, ptid_t ptid)
c906108c 619{
5b6d1e4f 620 return find_thread_ptid (targ, ptid) != nullptr;
c906108c 621}
8926118c 622
00431a78 623/* Finds the first thread of the inferior. */
bad34192 624
00431a78
PA
625thread_info *
626first_thread_of_inferior (inferior *inf)
bad34192 627{
08036331 628 return inf->thread_list;
bad34192
PA
629}
630
00431a78
PA
631thread_info *
632any_thread_of_inferior (inferior *inf)
2277426b 633{
00431a78 634 gdb_assert (inf->pid != 0);
32990ada
PA
635
636 /* Prefer the current thread. */
00431a78 637 if (inf == current_inferior ())
32990ada
PA
638 return inferior_thread ();
639
08036331
PA
640 for (thread_info *tp : inf->non_exited_threads ())
641 return tp;
2277426b
PA
642
643 return NULL;
644}
645
00431a78
PA
646thread_info *
647any_live_thread_of_inferior (inferior *inf)
6c95b8df 648{
32990ada 649 struct thread_info *curr_tp = NULL;
9941e0c5 650 struct thread_info *tp_executing = NULL;
6c95b8df 651
00431a78 652 gdb_assert (inf != NULL && inf->pid != 0);
32990ada
PA
653
654 /* Prefer the current thread if it's not executing. */
00431a78 655 if (inferior_ptid != null_ptid && current_inferior () == inf)
32990ada
PA
656 {
657 /* If the current thread is dead, forget it. If it's not
658 executing, use it. Otherwise, still choose it (below), but
659 only if no other non-executing thread is found. */
660 curr_tp = inferior_thread ();
661 if (curr_tp->state == THREAD_EXITED)
662 curr_tp = NULL;
663 else if (!curr_tp->executing)
664 return curr_tp;
665 }
666
08036331
PA
667 for (thread_info *tp : inf->non_exited_threads ())
668 {
669 if (!tp->executing)
670 return tp;
32990ada 671
08036331
PA
672 tp_executing = tp;
673 }
6c95b8df 674
32990ada
PA
675 /* If both the current thread and all live threads are executing,
676 prefer the current thread. */
677 if (curr_tp != NULL)
678 return curr_tp;
679
680 /* Otherwise, just return an executing thread, if any. */
9941e0c5 681 return tp_executing;
6c95b8df
PA
682}
683
c378eb4e 684/* Return true if TP is an active thread. */
f3f8ece4
PA
685static bool
686thread_alive (thread_info *tp)
c906108c 687{
30596231 688 if (tp->state == THREAD_EXITED)
f3f8ece4
PA
689 return false;
690
691 /* Ensure we're looking at the right target stack. */
692 gdb_assert (tp->inf == current_inferior ());
693
694 return target_thread_alive (tp->ptid);
695}
696
697/* Switch to thread TP if it is alive. Returns true if successfully
698 switched, false otherwise. */
699
700static bool
701switch_to_thread_if_alive (thread_info *thr)
702{
703 scoped_restore_current_thread restore_thread;
704
705 /* Switch inferior first, so that we're looking at the right target
706 stack. */
707 switch_to_inferior_no_thread (thr->inf);
708
709 if (thread_alive (thr))
710 {
711 switch_to_thread (thr);
712 restore_thread.dont_restore ();
713 return true;
714 }
715
716 return false;
c906108c
SS
717}
718
e8032dde
PA
719/* See gdbthreads.h. */
720
721void
fba45db2 722prune_threads (void)
c906108c 723{
f3f8ece4
PA
724 scoped_restore_current_thread restore_thread;
725
08036331 726 for (thread_info *tp : all_threads_safe ())
f3f8ece4
PA
727 {
728 switch_to_inferior_no_thread (tp->inf);
729
730 if (!thread_alive (tp))
731 delete_thread (tp);
732 }
c906108c
SS
733}
734
8a06aea7
PA
735/* See gdbthreads.h. */
736
737void
738delete_exited_threads (void)
739{
08036331
PA
740 for (thread_info *tp : all_threads_safe ())
741 if (tp->state == THREAD_EXITED)
742 delete_thread (tp);
8a06aea7
PA
743}
744
85102364 745/* Return true value if stack temporaries are enabled for the thread
00431a78 746 TP. */
6c659fc2 747
fdf07f3a 748bool
00431a78 749thread_stack_temporaries_enabled_p (thread_info *tp)
6c659fc2 750{
6c659fc2 751 if (tp == NULL)
fdf07f3a 752 return false;
6c659fc2
SC
753 else
754 return tp->stack_temporaries_enabled;
755}
756
757/* Push V on to the stack temporaries of the thread with id PTID. */
758
759void
00431a78 760push_thread_stack_temporary (thread_info *tp, struct value *v)
6c659fc2 761{
6c659fc2 762 gdb_assert (tp != NULL && tp->stack_temporaries_enabled);
fdf07f3a 763 tp->stack_temporaries.push_back (v);
6c659fc2
SC
764}
765
fdf07f3a 766/* Return true if VAL is among the stack temporaries of the thread
00431a78 767 TP. Return false otherwise. */
6c659fc2 768
fdf07f3a 769bool
00431a78 770value_in_thread_stack_temporaries (struct value *val, thread_info *tp)
6c659fc2 771{
6c659fc2 772 gdb_assert (tp != NULL && tp->stack_temporaries_enabled);
52941706 773 for (value *v : tp->stack_temporaries)
fdf07f3a
TT
774 if (v == val)
775 return true;
6c659fc2 776
fdf07f3a 777 return false;
6c659fc2
SC
778}
779
780/* Return the last of the stack temporaries for thread with id PTID.
781 Return NULL if there are no stack temporaries for the thread. */
782
00431a78
PA
783value *
784get_last_thread_stack_temporary (thread_info *tp)
6c659fc2
SC
785{
786 struct value *lastval = NULL;
6c659fc2
SC
787
788 gdb_assert (tp != NULL);
fdf07f3a
TT
789 if (!tp->stack_temporaries.empty ())
790 lastval = tp->stack_temporaries.back ();
6c659fc2
SC
791
792 return lastval;
793}
794
5231c1fd 795void
5b6d1e4f
PA
796thread_change_ptid (process_stratum_target *targ,
797 ptid_t old_ptid, ptid_t new_ptid)
5231c1fd 798{
82f73884
PA
799 struct inferior *inf;
800 struct thread_info *tp;
801
802 /* It can happen that what we knew as the target inferior id
803 changes. E.g, target remote may only discover the remote process
804 pid after adding the inferior to GDB's list. */
5b6d1e4f 805 inf = find_inferior_ptid (targ, old_ptid);
e99b03dc 806 inf->pid = new_ptid.pid ();
82f73884 807
08036331 808 tp = find_thread_ptid (inf, old_ptid);
5231c1fd
PA
809 tp->ptid = new_ptid;
810
b161a60d 811 gdb::observers::thread_ptid_changed.notify (targ, old_ptid, new_ptid);
5231c1fd
PA
812}
813
372316f1
PA
814/* See gdbthread.h. */
815
816void
5b6d1e4f 817set_resumed (process_stratum_target *targ, ptid_t ptid, bool resumed)
372316f1 818{
5b6d1e4f 819 for (thread_info *tp : all_non_exited_threads (targ, ptid))
08036331 820 tp->resumed = resumed;
372316f1
PA
821}
822
4d9d9d04
PA
823/* Helper for set_running, that marks one thread either running or
824 stopped. */
825
719546c4
SM
826static bool
827set_running_thread (struct thread_info *tp, bool running)
4d9d9d04 828{
719546c4 829 bool started = false;
4d9d9d04
PA
830
831 if (running && tp->state == THREAD_STOPPED)
719546c4 832 started = true;
4d9d9d04
PA
833 tp->state = running ? THREAD_RUNNING : THREAD_STOPPED;
834
835 if (!running)
836 {
837 /* If the thread is now marked stopped, remove it from
838 the step-over queue, so that we don't try to resume
839 it until the user wants it to. */
840 if (tp->step_over_next != NULL)
28d5518b 841 global_thread_step_over_chain_remove (tp);
4d9d9d04
PA
842 }
843
844 return started;
845}
846
00431a78
PA
847/* See gdbthread.h. */
848
849void
850thread_info::set_running (bool running)
851{
852 if (set_running_thread (this, running))
853 gdb::observers::target_resumed.notify (this->ptid);
854}
855
e1ac3328 856void
5b6d1e4f 857set_running (process_stratum_target *targ, ptid_t ptid, bool running)
e1ac3328 858{
08036331
PA
859 /* We try not to notify the observer if no thread has actually
860 changed the running state -- merely to reduce the number of
861 messages to the MI frontend. A frontend is supposed to handle
862 multiple *running notifications just fine. */
863 bool any_started = false;
e1ac3328 864
5b6d1e4f 865 for (thread_info *tp : all_non_exited_threads (targ, ptid))
08036331
PA
866 if (set_running_thread (tp, running))
867 any_started = true;
4d9d9d04 868
4d9d9d04 869 if (any_started)
76727919 870 gdb::observers::target_resumed.notify (ptid);
e1ac3328
VP
871}
872
8ea051c5 873
f2ffa92b
PA
874/* Helper for set_executing. Set's the thread's 'executing' field
875 from EXECUTING, and if EXECUTING is true also clears the thread's
876 stop_pc. */
877
878static void
879set_executing_thread (thread_info *thr, bool executing)
880{
881 thr->executing = executing;
882 if (executing)
883 thr->suspend.stop_pc = ~(CORE_ADDR) 0;
884}
885
8ea051c5 886void
5b6d1e4f 887set_executing (process_stratum_target *targ, ptid_t ptid, bool executing)
8ea051c5 888{
5b6d1e4f 889 for (thread_info *tp : all_non_exited_threads (targ, ptid))
08036331 890 set_executing_thread (tp, executing);
8ea051c5 891
08036331 892 /* It only takes one running thread to spawn more threads. */
b57bacec 893 if (executing)
5b6d1e4f 894 targ->threads_executing = true;
b57bacec
PA
895 /* Only clear the flag if the caller is telling us everything is
896 stopped. */
9295a5a9 897 else if (minus_one_ptid == ptid)
5b6d1e4f 898 targ->threads_executing = false;
b57bacec
PA
899}
900
901/* See gdbthread.h. */
902
5b6d1e4f
PA
903bool
904threads_are_executing (process_stratum_target *target)
b57bacec 905{
5b6d1e4f 906 return target->threads_executing;
8ea051c5
PA
907}
908
252fbfc8 909void
5b6d1e4f 910set_stop_requested (process_stratum_target *targ, ptid_t ptid, bool stop)
252fbfc8 911{
5b6d1e4f 912 for (thread_info *tp : all_non_exited_threads (targ, ptid))
08036331 913 tp->stop_requested = stop;
252fbfc8
PA
914
915 /* Call the stop requested observer so other components of GDB can
916 react to this request. */
917 if (stop)
76727919 918 gdb::observers::thread_stop_requested.notify (ptid);
252fbfc8
PA
919}
920
29f49a6a 921void
5b6d1e4f 922finish_thread_state (process_stratum_target *targ, ptid_t ptid)
29f49a6a 923{
08036331 924 bool any_started = false;
29f49a6a 925
5b6d1e4f 926 for (thread_info *tp : all_non_exited_threads (targ, ptid))
08036331
PA
927 if (set_running_thread (tp, tp->executing))
928 any_started = true;
29f49a6a
PA
929
930 if (any_started)
76727919 931 gdb::observers::target_resumed.notify (ptid);
29f49a6a
PA
932}
933
a911d87a
PA
934/* See gdbthread.h. */
935
936void
937validate_registers_access (void)
938{
939 /* No selected thread, no registers. */
9295a5a9 940 if (inferior_ptid == null_ptid)
a911d87a
PA
941 error (_("No thread selected."));
942
00431a78
PA
943 thread_info *tp = inferior_thread ();
944
a911d87a 945 /* Don't try to read from a dead thread. */
00431a78 946 if (tp->state == THREAD_EXITED)
a911d87a
PA
947 error (_("The current thread has terminated"));
948
949 /* ... or from a spinning thread. FIXME: This isn't actually fully
950 correct. It'll allow an user-requested access (e.g., "print $pc"
951 at the prompt) when a thread is not executing for some internal
952 reason, but is marked running from the user's perspective. E.g.,
953 the thread is waiting for its turn in the step-over queue. */
00431a78 954 if (tp->executing)
a911d87a
PA
955 error (_("Selected thread is running."));
956}
957
cf77c34e
MM
958/* See gdbthread.h. */
959
960bool
00431a78 961can_access_registers_thread (thread_info *thread)
cf77c34e
MM
962{
963 /* No thread, no registers. */
00431a78 964 if (thread == NULL)
cf77c34e
MM
965 return false;
966
967 /* Don't try to read from a dead thread. */
00431a78 968 if (thread->state == THREAD_EXITED)
cf77c34e
MM
969 return false;
970
971 /* ... or from a spinning thread. FIXME: see validate_registers_access. */
00431a78 972 if (thread->executing)
cf77c34e
MM
973 return false;
974
975 return true;
976}
977
ce4c476a
PA
978int
979pc_in_thread_step_range (CORE_ADDR pc, struct thread_info *thread)
980{
981 return (pc >= thread->control.step_range_start
982 && pc < thread->control.step_range_end);
983}
984
5d5658a1
PA
985/* Helper for print_thread_info. Returns true if THR should be
986 printed. If REQUESTED_THREADS, a list of GDB ids/ranges, is not
987 NULL, only print THR if its ID is included in the list. GLOBAL_IDS
988 is true if REQUESTED_THREADS is list of global IDs, false if a list
989 of per-inferior thread ids. If PID is not -1, only print THR if it
990 is a thread from the process PID. Otherwise, threads from all
991 attached PIDs are printed. If both REQUESTED_THREADS is not NULL
992 and PID is not -1, then the thread is printed if it belongs to the
993 specified process. Otherwise, an error is raised. */
994
995static int
996should_print_thread (const char *requested_threads, int default_inf_num,
997 int global_ids, int pid, struct thread_info *thr)
998{
999 if (requested_threads != NULL && *requested_threads != '\0')
1000 {
1001 int in_list;
1002
1003 if (global_ids)
1004 in_list = number_is_in_list (requested_threads, thr->global_num);
1005 else
1006 in_list = tid_is_in_list (requested_threads, default_inf_num,
1007 thr->inf->num, thr->per_inf_num);
1008 if (!in_list)
1009 return 0;
1010 }
1011
e99b03dc 1012 if (pid != -1 && thr->ptid.pid () != pid)
5d5658a1
PA
1013 {
1014 if (requested_threads != NULL && *requested_threads != '\0')
1015 error (_("Requested thread not found in requested process"));
1016 return 0;
1017 }
1018
1019 if (thr->state == THREAD_EXITED)
1020 return 0;
1021
1022 return 1;
1023}
1024
75acb486
PA
1025/* Return the string to display in "info threads"'s "Target Id"
1026 column, for TP. */
1027
1028static std::string
1029thread_target_id_str (thread_info *tp)
1030{
a068643d 1031 std::string target_id = target_pid_to_str (tp->ptid);
75acb486
PA
1032 const char *extra_info = target_extra_thread_info (tp);
1033 const char *name = tp->name != nullptr ? tp->name : target_thread_name (tp);
1034
1035 if (extra_info != nullptr && name != nullptr)
a068643d
TT
1036 return string_printf ("%s \"%s\" (%s)", target_id.c_str (), name,
1037 extra_info);
75acb486 1038 else if (extra_info != nullptr)
a068643d 1039 return string_printf ("%s (%s)", target_id.c_str (), extra_info);
75acb486 1040 else if (name != nullptr)
a068643d 1041 return string_printf ("%s \"%s\"", target_id.c_str (), name);
75acb486
PA
1042 else
1043 return target_id;
1044}
1045
5d5658a1
PA
1046/* Like print_thread_info, but in addition, GLOBAL_IDS indicates
1047 whether REQUESTED_THREADS is a list of global or per-inferior
1048 thread ids. */
1049
1050static void
1d12d88f 1051print_thread_info_1 (struct ui_out *uiout, const char *requested_threads,
5d5658a1
PA
1052 int global_ids, int pid,
1053 int show_global_ids)
c906108c 1054{
5d5658a1 1055 int default_inf_num = current_inferior ()->num;
c906108c 1056
dc146f7c 1057 update_thread_list ();
00431a78
PA
1058
1059 /* Whether we saw any thread. */
1060 bool any_thread = false;
1061 /* Whether the current thread is exited. */
1062 bool current_exited = false;
1063
1064 thread_info *current_thread = (inferior_ptid != null_ptid
1065 ? inferior_thread () : NULL);
4f8d22e3 1066
f8cc3da6
TT
1067 {
1068 /* For backward compatibility, we make a list for MI. A table is
1069 preferable for the CLI, though, because it shows table
1070 headers. */
1071 gdb::optional<ui_out_emit_list> list_emitter;
1072 gdb::optional<ui_out_emit_table> table_emitter;
1073
f3f8ece4
PA
1074 /* We'll be switching threads temporarily below. */
1075 scoped_restore_current_thread restore_thread;
1076
f8cc3da6
TT
1077 if (uiout->is_mi_like_p ())
1078 list_emitter.emplace (uiout, "threads");
1079 else
1080 {
1081 int n_threads = 0;
75acb486
PA
1082 /* The width of the "Target Id" column. Grown below to
1083 accommodate the largest entry. */
1084 size_t target_id_col_width = 17;
a7658b96 1085
08036331 1086 for (thread_info *tp : all_threads ())
f8cc3da6
TT
1087 {
1088 if (!should_print_thread (requested_threads, default_inf_num,
1089 global_ids, pid, tp))
1090 continue;
a7658b96 1091
75acb486
PA
1092 if (!uiout->is_mi_like_p ())
1093 {
f3f8ece4
PA
1094 /* Switch inferiors so we're looking at the right
1095 target stack. */
1096 switch_to_inferior_no_thread (tp->inf);
1097
75acb486
PA
1098 target_id_col_width
1099 = std::max (target_id_col_width,
1100 thread_target_id_str (tp).size ());
1101 }
1102
f8cc3da6
TT
1103 ++n_threads;
1104 }
a7658b96 1105
f8cc3da6
TT
1106 if (n_threads == 0)
1107 {
1108 if (requested_threads == NULL || *requested_threads == '\0')
1109 uiout->message (_("No threads.\n"));
1110 else
1111 uiout->message (_("No threads match '%s'.\n"),
1112 requested_threads);
1113 return;
1114 }
a7658b96 1115
0d64823e 1116 table_emitter.emplace (uiout, show_global_ids ? 5 : 4,
f8cc3da6 1117 n_threads, "threads");
a7658b96 1118
f8cc3da6 1119 uiout->table_header (1, ui_left, "current", "");
0d64823e
SM
1120 uiout->table_header (4, ui_left, "id-in-tg", "Id");
1121 if (show_global_ids)
f8cc3da6 1122 uiout->table_header (4, ui_left, "id", "GId");
75acb486
PA
1123 uiout->table_header (target_id_col_width, ui_left,
1124 "target-id", "Target Id");
f8cc3da6
TT
1125 uiout->table_header (1, ui_left, "frame", "Frame");
1126 uiout->table_body ();
1127 }
a7658b96 1128
08036331
PA
1129 for (inferior *inf : all_inferiors ())
1130 for (thread_info *tp : inf->threads ())
3061113b
SM
1131 {
1132 int core;
1133
1134 any_thread = true;
1135 if (tp == current_thread && tp->state == THREAD_EXITED)
1136 current_exited = true;
1137
1138 if (!should_print_thread (requested_threads, default_inf_num,
1139 global_ids, pid, tp))
1140 continue;
1141
1142 ui_out_emit_tuple tuple_emitter (uiout, NULL);
1143
1144 if (!uiout->is_mi_like_p ())
1145 {
1146 if (tp == current_thread)
1147 uiout->field_string ("current", "*");
1148 else
1149 uiout->field_skip ("current");
1150
1151 uiout->field_string ("id-in-tg", print_thread_id (tp));
1152 }
1153
1154 if (show_global_ids || uiout->is_mi_like_p ())
1155 uiout->field_signed ("id", tp->global_num);
1156
f3f8ece4
PA
1157 /* Switch to the thread (and inferior / target). */
1158 switch_to_thread (tp);
1159
3061113b
SM
1160 /* For the CLI, we stuff everything into the target-id field.
1161 This is a gross hack to make the output come out looking
1162 correct. The underlying problem here is that ui-out has no
1163 way to specify that a field's space allocation should be
1164 shared by several fields. For MI, we do the right thing
1165 instead. */
1166
1167 if (uiout->is_mi_like_p ())
1168 {
1169 uiout->field_string ("target-id", target_pid_to_str (tp->ptid));
1170
1171 const char *extra_info = target_extra_thread_info (tp);
1172 if (extra_info != nullptr)
1173 uiout->field_string ("details", extra_info);
1174
1175 const char *name = (tp->name != nullptr
1176 ? tp->name
1177 : target_thread_name (tp));
1178 if (name != NULL)
1179 uiout->field_string ("name", name);
1180 }
1181 else
1182 {
1183 uiout->field_string ("target-id",
1184 thread_target_id_str (tp).c_str ());
1185 }
1186
1187 if (tp->state == THREAD_RUNNING)
1188 uiout->text ("(running)\n");
1189 else
1190 {
f3f8ece4 1191 /* The switch above put us at the top of the stack (leaf
3061113b 1192 frame). */
3061113b
SM
1193 print_stack_frame (get_selected_frame (NULL),
1194 /* For MI output, print frame level. */
1195 uiout->is_mi_like_p (),
1196 LOCATION, 0);
1197 }
1198
1199 if (uiout->is_mi_like_p ())
1200 {
1201 const char *state = "stopped";
1202
1203 if (tp->state == THREAD_RUNNING)
1204 state = "running";
1205 uiout->field_string ("state", state);
1206 }
1207
1208 core = target_core_of_thread (tp->ptid);
1209 if (uiout->is_mi_like_p () && core != -1)
1210 uiout->field_signed ("core", core);
1211 }
c906108c 1212
5ed8105e 1213 /* This end scope restores the current thread and the frame
f8cc3da6
TT
1214 selected before the "info threads" command, and it finishes the
1215 ui-out list or table. */
5ed8105e
PA
1216 }
1217
aea5b279 1218 if (pid == -1 && requested_threads == NULL)
8e8901c5 1219 {
00431a78 1220 if (uiout->is_mi_like_p () && inferior_ptid != null_ptid)
381befee 1221 uiout->field_signed ("current-thread-id", current_thread->global_num);
5d5658a1 1222
00431a78 1223 if (inferior_ptid != null_ptid && current_exited)
112e8700 1224 uiout->message ("\n\
5d5658a1
PA
1225The current thread <Thread ID %s> has terminated. See `help thread'.\n",
1226 print_thread_id (inferior_thread ()));
00431a78 1227 else if (any_thread && inferior_ptid == null_ptid)
112e8700 1228 uiout->message ("\n\
d729566a 1229No selected thread. See `help thread'.\n");
c906108c 1230 }
c906108c
SS
1231}
1232
5d5658a1 1233/* See gdbthread.h. */
8e8901c5 1234
5d5658a1 1235void
24c54127
TT
1236print_thread_info (struct ui_out *uiout, const char *requested_threads,
1237 int pid)
5d5658a1
PA
1238{
1239 print_thread_info_1 (uiout, requested_threads, 1, pid, 0);
1240}
1241
54d66006
PA
1242/* The options for the "info threads" command. */
1243
1244struct info_threads_opts
1245{
1246 /* For "-gid". */
491144b5 1247 bool show_global_ids = false;
54d66006
PA
1248};
1249
1250static const gdb::option::option_def info_threads_option_defs[] = {
1251
1252 gdb::option::flag_option_def<info_threads_opts> {
1253 "gid",
1254 [] (info_threads_opts *opts) { return &opts->show_global_ids; },
1255 N_("Show global thread IDs."),
1256 },
1257
1258};
1259
1260/* Create an option_def_group for the "info threads" options, with
1261 IT_OPTS as context. */
1262
1263static inline gdb::option::option_def_group
1264make_info_threads_options_def_group (info_threads_opts *it_opts)
1265{
1266 return {{info_threads_option_defs}, it_opts};
1267}
1268
5d5658a1 1269/* Implementation of the "info threads" command.
60f98dde
MS
1270
1271 Note: this has the drawback that it _really_ switches
ae0eee42
PA
1272 threads, which frees the frame cache. A no-side
1273 effects info-threads command would be nicer. */
8e8901c5
VP
1274
1275static void
1d12d88f 1276info_threads_command (const char *arg, int from_tty)
8e8901c5 1277{
54d66006
PA
1278 info_threads_opts it_opts;
1279
1280 auto grp = make_info_threads_options_def_group (&it_opts);
1281 gdb::option::process_options
1282 (&arg, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp);
1283
1284 print_thread_info_1 (current_uiout, arg, 0, -1, it_opts.show_global_ids);
1285}
1286
1287/* Completer for the "info threads" command. */
c84f6bbf 1288
54d66006
PA
1289static void
1290info_threads_command_completer (struct cmd_list_element *ignore,
1291 completion_tracker &tracker,
1292 const char *text, const char *word_ignored)
1293{
1294 const auto grp = make_info_threads_options_def_group (nullptr);
1295
1296 if (gdb::option::complete_options
1297 (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp))
1298 return;
1299
1300 /* Convenience to let the user know what the option can accept. */
1301 if (*text == '\0')
c84f6bbf 1302 {
54d66006
PA
1303 gdb::option::complete_on_all_options (tracker, grp);
1304 /* Keep this "ID" in sync with what "help info threads"
1305 says. */
1306 tracker.add_completion (make_unique_xstrdup ("ID"));
c84f6bbf 1307 }
8e8901c5
VP
1308}
1309
6efcd9a8
PA
1310/* See gdbthread.h. */
1311
1312void
1313switch_to_thread_no_regs (struct thread_info *thread)
1314{
3a3fd0fd 1315 struct inferior *inf = thread->inf;
6efcd9a8 1316
6efcd9a8
PA
1317 set_current_program_space (inf->pspace);
1318 set_current_inferior (inf);
1319
3922b302
PA
1320 current_thread_ = thread;
1321 inferior_ptid = current_thread_->ptid;
6efcd9a8
PA
1322}
1323
00431a78 1324/* See gdbthread.h. */
c906108c 1325
00431a78 1326void
3a3fd0fd 1327switch_to_no_thread ()
c906108c 1328{
3922b302 1329 if (current_thread_ == nullptr)
3a3fd0fd 1330 return;
6c95b8df 1331
3922b302 1332 current_thread_ = nullptr;
3a3fd0fd
PA
1333 inferior_ptid = null_ptid;
1334 reinit_frame_cache ();
3a3fd0fd
PA
1335}
1336
00431a78 1337/* See gdbthread.h. */
6c95b8df 1338
00431a78 1339void
3a3fd0fd
PA
1340switch_to_thread (thread_info *thr)
1341{
1342 gdb_assert (thr != NULL);
1343
5b6d1e4f 1344 if (is_current_thread (thr))
c906108c
SS
1345 return;
1346
3a3fd0fd
PA
1347 switch_to_thread_no_regs (thr);
1348
35f196d9 1349 reinit_frame_cache ();
c906108c
SS
1350}
1351
268a13a5 1352/* See gdbsupport/common-gdbthread.h. */
3a3fd0fd
PA
1353
1354void
5b6d1e4f 1355switch_to_thread (process_stratum_target *proc_target, ptid_t ptid)
c906108c 1356{
5b6d1e4f 1357 thread_info *thr = find_thread_ptid (proc_target, ptid);
00431a78 1358 switch_to_thread (thr);
99b3d574
DP
1359}
1360
79952e69
PA
1361/* See frame.h. */
1362
873657b9
PA
1363void
1364scoped_restore_current_thread::restore ()
6ecce94d 1365{
803bdfe4
YQ
1366 /* If an entry of thread_info was previously selected, it won't be
1367 deleted because we've increased its refcount. The thread represented
1368 by this thread_info entry may have already exited (due to normal exit,
1369 detach, etc), so the thread_info.state is THREAD_EXITED. */
5ed8105e 1370 if (m_thread != NULL
803bdfe4
YQ
1371 /* If the previously selected thread belonged to a process that has
1372 in the mean time exited (or killed, detached, etc.), then don't revert
1373 back to it, but instead simply drop back to no thread selected. */
5ed8105e 1374 && m_inf->pid != 0)
cce20f10 1375 switch_to_thread (m_thread.get ());
88fc996f 1376 else
cce20f10 1377 switch_to_inferior_no_thread (m_inf.get ());
94cc34af 1378
4f8d22e3
PA
1379 /* The running state of the originally selected thread may have
1380 changed, so we have to recheck it here. */
9295a5a9 1381 if (inferior_ptid != null_ptid
5ed8105e 1382 && m_was_stopped
00431a78 1383 && m_thread->state == THREAD_STOPPED
9dccd06e 1384 && target_has_registers ()
841de120 1385 && target_has_stack ()
a739972c 1386 && target_has_memory ())
5ed8105e 1387 restore_selected_frame (m_selected_frame_id, m_selected_frame_level);
79952e69
PA
1388
1389 set_language (m_lang);
873657b9
PA
1390}
1391
1392scoped_restore_current_thread::~scoped_restore_current_thread ()
1393{
1394 if (!m_dont_restore)
79952e69 1395 restore ();
6ecce94d
AC
1396}
1397
5ed8105e 1398scoped_restore_current_thread::scoped_restore_current_thread ()
6ecce94d 1399{
cce20f10 1400 m_inf = inferior_ref::new_reference (current_inferior ());
4f8d22e3 1401
79952e69
PA
1402 m_lang = current_language->la_language;
1403
9295a5a9 1404 if (inferior_ptid != null_ptid)
d729566a 1405 {
cce20f10
PA
1406 m_thread = thread_info_ref::new_reference (inferior_thread ());
1407
cce20f10 1408 m_was_stopped = m_thread->state == THREAD_STOPPED;
79952e69 1409 save_selected_frame (&m_selected_frame_id, &m_selected_frame_level);
d729566a 1410 }
6ecce94d
AC
1411}
1412
43792cf0
PA
1413/* See gdbthread.h. */
1414
f303dbd6
PA
1415int
1416show_thread_that_caused_stop (void)
1417{
1418 return highest_thread_num > 1;
1419}
1420
1421/* See gdbthread.h. */
1422
5d5658a1
PA
1423int
1424show_inferior_qualified_tids (void)
1425{
1426 return (inferior_list->next != NULL || inferior_list->num != 1);
1427}
1428
1429/* See gdbthread.h. */
1430
43792cf0
PA
1431const char *
1432print_thread_id (struct thread_info *thr)
1433{
1434 char *s = get_print_cell ();
1435
5d5658a1
PA
1436 if (show_inferior_qualified_tids ())
1437 xsnprintf (s, PRINT_CELL_SIZE, "%d.%d", thr->inf->num, thr->per_inf_num);
1438 else
1439 xsnprintf (s, PRINT_CELL_SIZE, "%d", thr->per_inf_num);
43792cf0
PA
1440 return s;
1441}
1442
6665660a
PA
1443/* Sort an array of struct thread_info pointers by thread ID (first by
1444 inferior number, and then by per-inferior thread number). Sorts in
1445 ascending order. */
253828f1 1446
6665660a 1447static bool
bfcb9db8 1448tp_array_compar_ascending (const thread_info_ref &a, const thread_info_ref &b)
6665660a
PA
1449{
1450 if (a->inf->num != b->inf->num)
1451 return a->inf->num < b->inf->num;
1452
1453 return (a->per_inf_num < b->per_inf_num);
1454}
253828f1 1455
6665660a
PA
1456/* Sort an array of struct thread_info pointers by thread ID (first by
1457 inferior number, and then by per-inferior thread number). Sorts in
1458 descending order. */
253828f1 1459
c6609450 1460static bool
bfcb9db8 1461tp_array_compar_descending (const thread_info_ref &a, const thread_info_ref &b)
253828f1 1462{
5d5658a1 1463 if (a->inf->num != b->inf->num)
6665660a 1464 return a->inf->num > b->inf->num;
253828f1 1465
6665660a 1466 return (a->per_inf_num > b->per_inf_num);
253828f1
JK
1467}
1468
1fe75df7
PW
1469/* Switch to thread THR and execute CMD.
1470 FLAGS.QUIET controls the printing of the thread information.
1471 FLAGS.CONT and FLAGS.SILENT control how to handle errors. */
1472
1473static void
1474thr_try_catch_cmd (thread_info *thr, const char *cmd, int from_tty,
1475 const qcs_flags &flags)
1476{
1477 switch_to_thread (thr);
b65ce565
JG
1478
1479 /* The thread header is computed before running the command since
1480 the command can change the inferior, which is not permitted
1481 by thread_target_id_str. */
1482 std::string thr_header =
1483 string_printf (_("\nThread %s (%s):\n"), print_thread_id (thr),
1484 thread_target_id_str (thr).c_str ());
1485
a70b8144 1486 try
1fe75df7 1487 {
8a522c6c
PW
1488 std::string cmd_result = execute_command_to_string
1489 (cmd, from_tty, gdb_stdout->term_out ());
1fe75df7
PW
1490 if (!flags.silent || cmd_result.length () > 0)
1491 {
1492 if (!flags.quiet)
b65ce565 1493 printf_filtered ("%s", thr_header.c_str ());
1fe75df7
PW
1494 printf_filtered ("%s", cmd_result.c_str ());
1495 }
1496 }
230d2906 1497 catch (const gdb_exception_error &ex)
1fe75df7
PW
1498 {
1499 if (!flags.silent)
1500 {
1501 if (!flags.quiet)
b65ce565 1502 printf_filtered ("%s", thr_header.c_str ());
1fe75df7 1503 if (flags.cont)
3d6e9d23 1504 printf_filtered ("%s\n", ex.what ());
1fe75df7 1505 else
eedc3f4f 1506 throw;
1fe75df7
PW
1507 }
1508 }
1fe75df7
PW
1509}
1510
6665660a
PA
1511/* Option definition of "thread apply"'s "-ascending" option. */
1512
1513static const gdb::option::flag_option_def<> ascending_option_def = {
1514 "ascending",
1515 N_("\
1516Call COMMAND for all threads in ascending order.\n\
1517The default is descending order."),
1518};
1519
1520/* The qcs command line flags for the "thread apply" commands. Keep
1521 this in sync with the "frame apply" commands. */
1522
1523using qcs_flag_option_def
1524 = gdb::option::flag_option_def<qcs_flags>;
1525
1526static const gdb::option::option_def thr_qcs_flags_option_defs[] = {
1527 qcs_flag_option_def {
1528 "q", [] (qcs_flags *opt) { return &opt->quiet; },
1529 N_("Disables printing the thread information."),
1530 },
1531
1532 qcs_flag_option_def {
1533 "c", [] (qcs_flags *opt) { return &opt->cont; },
1534 N_("Print any error raised by COMMAND and continue."),
1535 },
1536
1537 qcs_flag_option_def {
1538 "s", [] (qcs_flags *opt) { return &opt->silent; },
1539 N_("Silently ignore any errors or empty output produced by COMMAND."),
1540 },
1541};
1542
1543/* Create an option_def_group for the "thread apply all" options, with
1544 ASCENDING and FLAGS as context. */
1545
1546static inline std::array<gdb::option::option_def_group, 2>
491144b5 1547make_thread_apply_all_options_def_group (bool *ascending,
6665660a
PA
1548 qcs_flags *flags)
1549{
1550 return {{
66eb1ed3
PA
1551 { {ascending_option_def.def ()}, ascending},
1552 { {thr_qcs_flags_option_defs}, flags },
6665660a
PA
1553 }};
1554}
1555
1556/* Create an option_def_group for the "thread apply" options, with
1557 FLAGS as context. */
1558
1559static inline gdb::option::option_def_group
1560make_thread_apply_options_def_group (qcs_flags *flags)
1561{
66eb1ed3 1562 return {{thr_qcs_flags_option_defs}, flags};
6665660a
PA
1563}
1564
c906108c 1565/* Apply a GDB command to a list of threads. List syntax is a whitespace
224608c3
PW
1566 separated list of numbers, or ranges, or the keyword `all'. Ranges consist
1567 of two numbers separated by a hyphen. Examples:
c906108c 1568
c5aa993b
JM
1569 thread apply 1 2 7 4 backtrace Apply backtrace cmd to threads 1,2,7,4
1570 thread apply 2-7 9 p foo(1) Apply p foo(1) cmd to threads 2->7 & 9
224608c3 1571 thread apply all x/i $pc Apply x/i $pc cmd to all threads. */
c906108c
SS
1572
1573static void
5fed81ff 1574thread_apply_all_command (const char *cmd, int from_tty)
c906108c 1575{
491144b5 1576 bool ascending = false;
1fe75df7
PW
1577 qcs_flags flags;
1578
6665660a
PA
1579 auto group = make_thread_apply_all_options_def_group (&ascending,
1580 &flags);
1581 gdb::option::process_options
1582 (&cmd, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, group);
1fe75df7 1583
6665660a 1584 validate_flags_qcs ("thread apply all", &flags);
253828f1 1585
c906108c 1586 if (cmd == NULL || *cmd == '\000')
1fe75df7 1587 error (_("Please specify a command at the end of 'thread apply all'"));
94cc34af 1588
dc146f7c 1589 update_thread_list ();
e9d196c5 1590
c6609450 1591 int tc = live_threads_count ();
a25d8bf9 1592 if (tc != 0)
054e8d9e 1593 {
c6609450
PA
1594 /* Save a copy of the thread list and increment each thread's
1595 refcount while executing the command in the context of each
1596 thread, in case the command is one that wipes threads. E.g.,
1597 detach, kill, disconnect, etc., or even normally continuing
1598 over an inferior or thread exit. */
bfcb9db8 1599 std::vector<thread_info_ref> thr_list_cpy;
c6609450 1600 thr_list_cpy.reserve (tc);
054e8d9e 1601
08036331 1602 for (thread_info *tp : all_non_exited_threads ())
bfcb9db8 1603 thr_list_cpy.push_back (thread_info_ref::new_reference (tp));
08036331 1604 gdb_assert (thr_list_cpy.size () == tc);
054e8d9e 1605
6665660a
PA
1606 auto *sorter = (ascending
1607 ? tp_array_compar_ascending
1608 : tp_array_compar_descending);
1609 std::sort (thr_list_cpy.begin (), thr_list_cpy.end (), sorter);
054e8d9e 1610
5ed8105e
PA
1611 scoped_restore_current_thread restore_thread;
1612
bfcb9db8
TT
1613 for (thread_info_ref &thr : thr_list_cpy)
1614 if (switch_to_thread_if_alive (thr.get ()))
1615 thr_try_catch_cmd (thr.get (), cmd, from_tty, flags);
054e8d9e 1616 }
c906108c
SS
1617}
1618
6665660a
PA
1619/* Completer for "thread apply [ID list]". */
1620
1621static void
1622thread_apply_command_completer (cmd_list_element *ignore,
1623 completion_tracker &tracker,
1624 const char *text, const char * /*word*/)
1625{
1626 /* Don't leave this to complete_options because there's an early
1627 return below. */
1628 tracker.set_use_custom_word_point (true);
1629
1630 tid_range_parser parser;
1631 parser.init (text, current_inferior ()->num);
1632
1633 try
1634 {
1635 while (!parser.finished ())
1636 {
1637 int inf_num, thr_start, thr_end;
1638
1639 if (!parser.get_tid_range (&inf_num, &thr_start, &thr_end))
1640 break;
1641
1642 if (parser.in_star_range () || parser.in_thread_range ())
1643 parser.skip_range ();
1644 }
1645 }
1646 catch (const gdb_exception_error &ex)
1647 {
1648 /* get_tid_range throws if it parses a negative number, for
1649 example. But a seemingly negative number may be the start of
1650 an option instead. */
1651 }
1652
1653 const char *cmd = parser.cur_tok ();
1654
1655 if (cmd == text)
1656 {
1657 /* No thread ID list yet. */
1658 return;
1659 }
1660
1661 /* Check if we're past a valid thread ID list already. */
1662 if (parser.finished ()
1663 && cmd > text && !isspace (cmd[-1]))
1664 return;
1665
1666 /* We're past the thread ID list, advance word point. */
1667 tracker.advance_custom_word_point_by (cmd - text);
1668 text = cmd;
1669
1670 const auto group = make_thread_apply_options_def_group (nullptr);
1671 if (gdb::option::complete_options
1672 (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, group))
1673 return;
1674
1675 complete_nested_command_line (tracker, text);
1676}
1677
1678/* Completer for "thread apply all". */
1679
1680static void
1681thread_apply_all_command_completer (cmd_list_element *ignore,
1682 completion_tracker &tracker,
1683 const char *text, const char *word)
1684{
1685 const auto group = make_thread_apply_all_options_def_group (nullptr,
1686 nullptr);
1687 if (gdb::option::complete_options
1688 (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, group))
1689 return;
1690
1691 complete_nested_command_line (tracker, text);
1692}
1693
43792cf0
PA
1694/* Implementation of the "thread apply" command. */
1695
c906108c 1696static void
981a3fb3 1697thread_apply_command (const char *tidlist, int from_tty)
c906108c 1698{
1fe75df7 1699 qcs_flags flags;
95a6b0a1 1700 const char *cmd = NULL;
bfd28288 1701 tid_range_parser parser;
c906108c
SS
1702
1703 if (tidlist == NULL || *tidlist == '\000')
8a3fe4f8 1704 error (_("Please specify a thread ID list"));
c906108c 1705
bfd28288
PA
1706 parser.init (tidlist, current_inferior ()->num);
1707 while (!parser.finished ())
3f5b7598
PA
1708 {
1709 int inf_num, thr_start, thr_end;
c906108c 1710
bfd28288 1711 if (!parser.get_tid_range (&inf_num, &thr_start, &thr_end))
b9a3f842 1712 break;
3f5b7598
PA
1713 }
1714
b9a3f842
PA
1715 cmd = parser.cur_tok ();
1716
6665660a
PA
1717 auto group = make_thread_apply_options_def_group (&flags);
1718 gdb::option::process_options
1719 (&cmd, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, group);
1720
1721 validate_flags_qcs ("thread apply", &flags);
1fe75df7 1722
b9a3f842 1723 if (*cmd == '\0')
8a3fe4f8 1724 error (_("Please specify a command following the thread ID list"));
c906108c 1725
f7e13587 1726 if (tidlist == cmd || isdigit (cmd[0]))
3f5b7598
PA
1727 invalid_thread_id_error (cmd);
1728
5ed8105e 1729 scoped_restore_current_thread restore_thread;
c906108c 1730
bfd28288 1731 parser.init (tidlist, current_inferior ()->num);
b9a3f842 1732 while (!parser.finished ())
5d5658a1
PA
1733 {
1734 struct thread_info *tp = NULL;
1735 struct inferior *inf;
1736 int inf_num, thr_num;
65fc9b77 1737
bfd28288 1738 parser.get_tid (&inf_num, &thr_num);
5d5658a1
PA
1739 inf = find_inferior_id (inf_num);
1740 if (inf != NULL)
1741 tp = find_thread_id (inf, thr_num);
71ef29a8 1742
bfd28288 1743 if (parser.in_star_range ())
71ef29a8
PA
1744 {
1745 if (inf == NULL)
1746 {
1747 warning (_("Unknown inferior %d"), inf_num);
bfd28288 1748 parser.skip_range ();
71ef29a8
PA
1749 continue;
1750 }
1751
1752 /* No use looking for threads past the highest thread number
1753 the inferior ever had. */
1754 if (thr_num >= inf->highest_thread_num)
bfd28288 1755 parser.skip_range ();
71ef29a8
PA
1756
1757 /* Be quiet about unknown threads numbers. */
1758 if (tp == NULL)
1759 continue;
1760 }
1761
5d5658a1
PA
1762 if (tp == NULL)
1763 {
bfd28288 1764 if (show_inferior_qualified_tids () || parser.tid_is_qualified ())
5d5658a1
PA
1765 warning (_("Unknown thread %d.%d"), inf_num, thr_num);
1766 else
1767 warning (_("Unknown thread %d"), thr_num);
1768 continue;
1769 }
c906108c 1770
f3f8ece4 1771 if (!switch_to_thread_if_alive (tp))
65ebfb52 1772 {
5d5658a1
PA
1773 warning (_("Thread %s has terminated."), print_thread_id (tp));
1774 continue;
1775 }
4f8d22e3 1776
1fe75df7 1777 thr_try_catch_cmd (tp, cmd, from_tty, flags);
c906108c
SS
1778 }
1779}
1780
1fe75df7
PW
1781
1782/* Implementation of the "taas" command. */
1783
1784static void
1785taas_command (const char *cmd, int from_tty)
1786{
e0fad1ea
PW
1787 if (cmd == NULL || *cmd == '\0')
1788 error (_("Please specify a command to apply on all threads"));
1fe75df7
PW
1789 std::string expanded = std::string ("thread apply all -s ") + cmd;
1790 execute_command (expanded.c_str (), from_tty);
1791}
1792
1793/* Implementation of the "tfaas" command. */
1794
1795static void
1796tfaas_command (const char *cmd, int from_tty)
1797{
e0fad1ea
PW
1798 if (cmd == NULL || *cmd == '\0')
1799 error (_("Please specify a command to apply on all frames of all threads"));
1fe75df7 1800 std::string expanded
5d707134 1801 = std::string ("thread apply all -s -- frame apply all -s ") + cmd;
1fe75df7
PW
1802 execute_command (expanded.c_str (), from_tty);
1803}
1804
224608c3 1805/* Switch to the specified thread, or print the current thread. */
c906108c 1806
f0e8c4c5 1807void
981a3fb3 1808thread_command (const char *tidstr, int from_tty)
c906108c 1809{
4034d0ff 1810 if (tidstr == NULL)
c906108c 1811 {
9295a5a9 1812 if (inferior_ptid == null_ptid)
d729566a
PA
1813 error (_("No thread selected"));
1814
841de120 1815 if (target_has_stack ())
4f8d22e3 1816 {
43792cf0
PA
1817 struct thread_info *tp = inferior_thread ();
1818
00431a78 1819 if (tp->state == THREAD_EXITED)
43792cf0
PA
1820 printf_filtered (_("[Current thread is %s (%s) (exited)]\n"),
1821 print_thread_id (tp),
a068643d 1822 target_pid_to_str (inferior_ptid).c_str ());
4f8d22e3 1823 else
43792cf0
PA
1824 printf_filtered (_("[Current thread is %s (%s)]\n"),
1825 print_thread_id (tp),
a068643d 1826 target_pid_to_str (inferior_ptid).c_str ());
4f8d22e3 1827 }
c906108c 1828 else
8a3fe4f8 1829 error (_("No stack."));
c906108c 1830 }
4034d0ff
AT
1831 else
1832 {
1833 ptid_t previous_ptid = inferior_ptid;
4034d0ff 1834
65630365 1835 thread_select (tidstr, parse_thread_id (tidstr, NULL));
c5394b80 1836
ae0eee42
PA
1837 /* Print if the thread has not changed, otherwise an event will
1838 be sent. */
9295a5a9 1839 if (inferior_ptid == previous_ptid)
4034d0ff
AT
1840 {
1841 print_selected_thread_frame (current_uiout,
1842 USER_SELECTED_THREAD
1843 | USER_SELECTED_FRAME);
1844 }
1845 else
1846 {
76727919
TT
1847 gdb::observers::user_selected_context_changed.notify
1848 (USER_SELECTED_THREAD | USER_SELECTED_FRAME);
4034d0ff
AT
1849 }
1850 }
c5394b80
JM
1851}
1852
4694da01
TT
1853/* Implementation of `thread name'. */
1854
1855static void
fc41a75b 1856thread_name_command (const char *arg, int from_tty)
4694da01
TT
1857{
1858 struct thread_info *info;
1859
9295a5a9 1860 if (inferior_ptid == null_ptid)
4694da01
TT
1861 error (_("No thread selected"));
1862
529480d0 1863 arg = skip_spaces (arg);
4694da01
TT
1864
1865 info = inferior_thread ();
1866 xfree (info->name);
1867 info->name = arg ? xstrdup (arg) : NULL;
1868}
1869
60f98dde
MS
1870/* Find thread ids with a name, target pid, or extra info matching ARG. */
1871
1872static void
fc41a75b 1873thread_find_command (const char *arg, int from_tty)
60f98dde 1874{
73ede765 1875 const char *tmp;
60f98dde
MS
1876 unsigned long match = 0;
1877
1878 if (arg == NULL || *arg == '\0')
1879 error (_("Command requires an argument."));
1880
1881 tmp = re_comp (arg);
1882 if (tmp != 0)
1883 error (_("Invalid regexp (%s): %s"), tmp, arg);
1884
e8ef12b9
PA
1885 /* We're going to be switching threads. */
1886 scoped_restore_current_thread restore_thread;
1887
60f98dde 1888 update_thread_list ();
e8ef12b9 1889
08036331 1890 for (thread_info *tp : all_threads ())
60f98dde 1891 {
e8ef12b9
PA
1892 switch_to_inferior_no_thread (tp->inf);
1893
60f98dde
MS
1894 if (tp->name != NULL && re_exec (tp->name))
1895 {
43792cf0
PA
1896 printf_filtered (_("Thread %s has name '%s'\n"),
1897 print_thread_id (tp), tp->name);
60f98dde
MS
1898 match++;
1899 }
1900
1901 tmp = target_thread_name (tp);
1902 if (tmp != NULL && re_exec (tmp))
1903 {
43792cf0
PA
1904 printf_filtered (_("Thread %s has target name '%s'\n"),
1905 print_thread_id (tp), tmp);
60f98dde
MS
1906 match++;
1907 }
1908
a068643d
TT
1909 std::string name = target_pid_to_str (tp->ptid);
1910 if (!name.empty () && re_exec (name.c_str ()))
60f98dde 1911 {
43792cf0 1912 printf_filtered (_("Thread %s has target id '%s'\n"),
a068643d 1913 print_thread_id (tp), name.c_str ());
60f98dde
MS
1914 match++;
1915 }
1916
1917 tmp = target_extra_thread_info (tp);
1918 if (tmp != NULL && re_exec (tmp))
1919 {
43792cf0
PA
1920 printf_filtered (_("Thread %s has extra info '%s'\n"),
1921 print_thread_id (tp), tmp);
60f98dde
MS
1922 match++;
1923 }
1924 }
1925 if (!match)
1926 printf_filtered (_("No threads match '%s'\n"), arg);
1927}
1928
93815fbf 1929/* Print notices when new threads are attached and detached. */
491144b5 1930bool print_thread_events = true;
93815fbf
VP
1931static void
1932show_print_thread_events (struct ui_file *file, int from_tty,
ae0eee42 1933 struct cmd_list_element *c, const char *value)
93815fbf 1934{
3e43a32a
MS
1935 fprintf_filtered (file,
1936 _("Printing of thread events is %s.\n"),
ae0eee42 1937 value);
93815fbf
VP
1938}
1939
65630365 1940/* See gdbthread.h. */
c906108c 1941
65630365
PA
1942void
1943thread_select (const char *tidstr, thread_info *tp)
1944{
f3f8ece4 1945 if (!switch_to_thread_if_alive (tp))
5d5658a1 1946 error (_("Thread ID %s has terminated."), tidstr);
c906108c 1947
db5a7484
NR
1948 annotate_thread_changed ();
1949
4034d0ff
AT
1950 /* Since the current thread may have changed, see if there is any
1951 exited thread we can now delete. */
a05575d3 1952 delete_exited_threads ();
4034d0ff
AT
1953}
1954
1955/* Print thread and frame switch command response. */
1956
1957void
1958print_selected_thread_frame (struct ui_out *uiout,
1959 user_selected_what selection)
1960{
1961 struct thread_info *tp = inferior_thread ();
4034d0ff
AT
1962
1963 if (selection & USER_SELECTED_THREAD)
5d5658a1 1964 {
112e8700 1965 if (uiout->is_mi_like_p ())
4034d0ff 1966 {
381befee
TT
1967 uiout->field_signed ("new-thread-id",
1968 inferior_thread ()->global_num);
4034d0ff
AT
1969 }
1970 else
1971 {
112e8700
SM
1972 uiout->text ("[Switching to thread ");
1973 uiout->field_string ("new-thread-id", print_thread_id (tp));
1974 uiout->text (" (");
a068643d 1975 uiout->text (target_pid_to_str (inferior_ptid).c_str ());
112e8700 1976 uiout->text (")]");
4034d0ff 1977 }
5d5658a1 1978 }
c5394b80 1979
30596231 1980 if (tp->state == THREAD_RUNNING)
98871305 1981 {
4034d0ff 1982 if (selection & USER_SELECTED_THREAD)
112e8700 1983 uiout->text ("(running)\n");
98871305 1984 }
4034d0ff
AT
1985 else if (selection & USER_SELECTED_FRAME)
1986 {
1987 if (selection & USER_SELECTED_THREAD)
112e8700 1988 uiout->text ("\n");
4f8d22e3 1989
4034d0ff
AT
1990 if (has_stack_frames ())
1991 print_stack_frame_to_uiout (uiout, get_selected_frame (NULL),
1992 1, SRC_AND_LOC, 1);
1993 }
c5394b80
JM
1994}
1995
b57bacec 1996/* Update the 'threads_executing' global based on the threads we know
5b6d1e4f
PA
1997 about right now. This is used by infrun to tell whether we should
1998 pull events out of the current target. */
b57bacec
PA
1999
2000static void
2001update_threads_executing (void)
2002{
5b6d1e4f
PA
2003 process_stratum_target *targ = current_inferior ()->process_target ();
2004
2005 if (targ == NULL)
2006 return;
2007
2008 targ->threads_executing = false;
2009
2010 for (inferior *inf : all_non_exited_inferiors (targ))
b57bacec 2011 {
5b6d1e4f
PA
2012 if (!inf->has_execution ())
2013 continue;
2014
2015 /* If the process has no threads, then it must be we have a
2016 process-exit event pending. */
2017 if (inf->thread_list == NULL)
2018 {
2019 targ->threads_executing = true;
2020 return;
2021 }
2022
2023 for (thread_info *tp : inf->non_exited_threads ())
b57bacec 2024 {
5b6d1e4f
PA
2025 if (tp->executing)
2026 {
2027 targ->threads_executing = true;
2028 return;
2029 }
b57bacec
PA
2030 }
2031 }
2032}
2033
dc146f7c
VP
2034void
2035update_thread_list (void)
2036{
e8032dde 2037 target_update_thread_list ();
b57bacec 2038 update_threads_executing ();
dc146f7c
VP
2039}
2040
663f6d42
PA
2041/* Return a new value for the selected thread's id. Return a value of
2042 0 if no thread is selected. If GLOBAL is true, return the thread's
2043 global number. Otherwise return the per-inferior number. */
2044
2045static struct value *
2046thread_num_make_value_helper (struct gdbarch *gdbarch, int global)
2047{
663f6d42
PA
2048 int int_val;
2049
00431a78 2050 if (inferior_ptid == null_ptid)
663f6d42 2051 int_val = 0;
663f6d42 2052 else
00431a78
PA
2053 {
2054 thread_info *tp = inferior_thread ();
2055 if (global)
2056 int_val = tp->global_num;
2057 else
2058 int_val = tp->per_inf_num;
2059 }
663f6d42
PA
2060
2061 return value_from_longest (builtin_type (gdbarch)->builtin_int, int_val);
2062}
2063
5d5658a1
PA
2064/* Return a new value for the selected thread's per-inferior thread
2065 number. Return a value of 0 if no thread is selected, or no
2066 threads exist. */
6aed2dbc
SS
2067
2068static struct value *
ae0eee42
PA
2069thread_id_per_inf_num_make_value (struct gdbarch *gdbarch,
2070 struct internalvar *var,
663f6d42 2071 void *ignore)
6aed2dbc 2072{
663f6d42
PA
2073 return thread_num_make_value_helper (gdbarch, 0);
2074}
2075
2076/* Return a new value for the selected thread's global id. Return a
2077 value of 0 if no thread is selected, or no threads exist. */
6aed2dbc 2078
663f6d42
PA
2079static struct value *
2080global_thread_id_make_value (struct gdbarch *gdbarch, struct internalvar *var,
2081 void *ignore)
2082{
2083 return thread_num_make_value_helper (gdbarch, 1);
6aed2dbc
SS
2084}
2085
c906108c
SS
2086/* Commands with a prefix of `thread'. */
2087struct cmd_list_element *thread_cmd_list = NULL;
2088
22d2b532
SDJ
2089/* Implementation of `thread' variable. */
2090
2091static const struct internalvar_funcs thread_funcs =
2092{
663f6d42
PA
2093 thread_id_per_inf_num_make_value,
2094 NULL,
2095 NULL
2096};
2097
2098/* Implementation of `gthread' variable. */
2099
2100static const struct internalvar_funcs gthread_funcs =
2101{
2102 global_thread_id_make_value,
22d2b532
SDJ
2103 NULL,
2104 NULL
2105};
2106
6c265988 2107void _initialize_thread ();
c906108c 2108void
6c265988 2109_initialize_thread ()
c906108c
SS
2110{
2111 static struct cmd_list_element *thread_apply_list = NULL;
5d707134 2112 cmd_list_element *c;
c906108c 2113
54d66006
PA
2114 const auto info_threads_opts = make_info_threads_options_def_group (nullptr);
2115
2116 /* Note: keep this "ID" in sync with what "info threads [TAB]"
2117 suggests. */
2118 static std::string info_threads_help
2119 = gdb::option::build_help (_("\
2120Display currently known threads.\n\
2121Usage: info threads [OPTION]... [ID]...\n\
3c6eb4d4
TBA
2122If ID is given, it is a space-separated list of IDs of threads to display.\n\
2123Otherwise, all threads are displayed.\n\
54d66006
PA
2124\n\
2125Options:\n\
3c6eb4d4 2126%OPTIONS%"),
54d66006
PA
2127 info_threads_opts);
2128
2129 c = add_info ("threads", info_threads_command, info_threads_help.c_str ());
2130 set_cmd_completer_handle_brkchars (c, info_threads_command_completer);
c906108c 2131
d729566a 2132 add_prefix_cmd ("thread", class_run, thread_command, _("\
1bedd215
AC
2133Use this command to switch between threads.\n\
2134The new thread ID must be currently known."),
d729566a 2135 &thread_cmd_list, "thread ", 1, &cmdlist);
c906108c 2136
6665660a 2137#define THREAD_APPLY_OPTION_HELP "\
1fe75df7
PW
2138Prints per-inferior thread number and target system's thread id\n\
2139followed by COMMAND output.\n\
6665660a
PA
2140\n\
2141By default, an error raised during the execution of COMMAND\n\
2142aborts \"thread apply\".\n\
2143\n\
2144Options:\n\
2145%OPTIONS%"
2146
2147 const auto thread_apply_opts = make_thread_apply_options_def_group (nullptr);
2148
8abfcabc 2149 static std::string thread_apply_help = gdb::option::build_help (_("\
6665660a
PA
2150Apply a command to a list of threads.\n\
2151Usage: thread apply ID... [OPTION]... COMMAND\n\
1fe75df7 2152ID is a space-separated list of IDs of threads to apply COMMAND on.\n"
6665660a
PA
2153THREAD_APPLY_OPTION_HELP),
2154 thread_apply_opts);
2155
2156 c = add_prefix_cmd ("apply", class_run, thread_apply_command,
2157 thread_apply_help.c_str (),
2158 &thread_apply_list, "thread apply ", 1,
2159 &thread_cmd_list);
2160 set_cmd_completer_handle_brkchars (c, thread_apply_command_completer);
c906108c 2161
6665660a
PA
2162 const auto thread_apply_all_opts
2163 = make_thread_apply_all_options_def_group (nullptr, nullptr);
2164
8abfcabc 2165 static std::string thread_apply_all_help = gdb::option::build_help (_("\
253828f1
JK
2166Apply a command to all threads.\n\
2167\n\
6665660a
PA
2168Usage: thread apply all [OPTION]... COMMAND\n"
2169THREAD_APPLY_OPTION_HELP),
2170 thread_apply_all_opts);
2171
2172 c = add_cmd ("all", class_run, thread_apply_all_command,
2173 thread_apply_all_help.c_str (),
2174 &thread_apply_list);
2175 set_cmd_completer_handle_brkchars (c, thread_apply_all_command_completer);
c906108c 2176
6665660a 2177 c = add_com ("taas", class_run, taas_command, _("\
1fe75df7 2178Apply a command to all threads (ignoring errors and empty output).\n\
6665660a
PA
2179Usage: taas [OPTION]... COMMAND\n\
2180shortcut for 'thread apply all -s [OPTION]... COMMAND'\n\
2181See \"help thread apply all\" for available options."));
2182 set_cmd_completer_handle_brkchars (c, thread_apply_all_command_completer);
1fe75df7 2183
5d707134 2184 c = add_com ("tfaas", class_run, tfaas_command, _("\
1fe75df7 2185Apply a command to all frames of all threads (ignoring errors and empty output).\n\
5d707134
PA
2186Usage: tfaas [OPTION]... COMMAND\n\
2187shortcut for 'thread apply all -s -- frame apply all -s [OPTION]... COMMAND'\n\
2188See \"help frame apply all\" for available options."));
2189 set_cmd_completer_handle_brkchars (c, frame_apply_all_cmd_completer);
1fe75df7 2190
4694da01
TT
2191 add_cmd ("name", class_run, thread_name_command,
2192 _("Set the current thread's name.\n\
2193Usage: thread name [NAME]\n\
2194If NAME is not given, then any existing name is removed."), &thread_cmd_list);
2195
60f98dde
MS
2196 add_cmd ("find", class_run, thread_find_command, _("\
2197Find threads that match a regular expression.\n\
2198Usage: thread find REGEXP\n\
2199Will display thread ids whose name, target ID, or extra info matches REGEXP."),
2200 &thread_cmd_list);
2201
4f45d445 2202 add_com_alias ("t", "thread", class_run, 1);
93815fbf
VP
2203
2204 add_setshow_boolean_cmd ("thread-events", no_class,
ae0eee42 2205 &print_thread_events, _("\
11c68c47
EZ
2206Set printing of thread events (such as thread start and exit)."), _("\
2207Show printing of thread events (such as thread start and exit)."), NULL,
ae0eee42
PA
2208 NULL,
2209 show_print_thread_events,
2210 &setprintlist, &showprintlist);
6aed2dbc 2211
22d2b532 2212 create_internalvar_type_lazy ("_thread", &thread_funcs, NULL);
663f6d42 2213 create_internalvar_type_lazy ("_gthread", &gthread_funcs, NULL);
c906108c 2214}
This page took 2.383252 seconds and 4 git commands to generate.