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