]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/thread.c
* ada-lang.c (ada_find_any_type): Move check for primitive types ...
[thirdparty/binutils-gdb.git] / gdb / thread.c
CommitLineData
c906108c 1/* Multi-process/thread control for GDB, the GNU debugger.
8926118c 2
6aba47ca 3 Copyright (C) 1986, 1987, 1988, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
0fb0cc75
JB
4 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009
5 Free Software Foundation, Inc.
8926118c 6
b6ba6518 7 Contributed by Lynx Real-Time Systems, Inc. Los Gatos, CA.
c906108c 8
c5aa993b 9 This file is part of GDB.
c906108c 10
c5aa993b
JM
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
a9762ec7 13 the Free Software Foundation; either version 3 of the License, or
c5aa993b 14 (at your option) any later version.
c906108c 15
c5aa993b
JM
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
c906108c 20
c5aa993b 21 You should have received a copy of the GNU General Public License
a9762ec7 22 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
23
24#include "defs.h"
25#include "symtab.h"
26#include "frame.h"
27#include "inferior.h"
28#include "environ.h"
29#include "value.h"
30#include "target.h"
31#include "gdbthread.h"
60250e8b 32#include "exceptions.h"
c906108c
SS
33#include "command.h"
34#include "gdbcmd.h"
4e052eda 35#include "regcache.h"
5b7f31a4 36#include "gdb.h"
b66d6d2e 37#include "gdb_string.h"
c906108c
SS
38
39#include <ctype.h>
40#include <sys/types.h>
41#include <signal.h>
8b93c638 42#include "ui-out.h"
683f2885 43#include "observer.h"
d4fc5b1e 44#include "annotate.h"
94cc34af
PA
45#include "cli/cli-decode.h"
46
0d06e24b 47/* Definition of struct thread_info exported to gdbthread.h */
c906108c
SS
48
49/* Prototypes for exported functions. */
50
a14ed312 51void _initialize_thread (void);
c906108c
SS
52
53/* Prototypes for local functions. */
54
c906108c
SS
55static struct thread_info *thread_list = NULL;
56static int highest_thread_num;
57
a14ed312
KB
58static void thread_command (char *tidstr, int from_tty);
59static void thread_apply_all_command (char *, int);
60static int thread_alive (struct thread_info *);
61static void info_threads_command (char *, int);
62static void thread_apply_command (char *, int);
39f77062 63static void restore_current_thread (ptid_t);
a14ed312 64static void prune_threads (void);
c906108c 65
4f8d22e3
PA
66/* Frontend view of the thread state. Possible extensions: stepping,
67 finishing, until(ling),... */
68enum thread_state
69{
70 THREAD_STOPPED,
71 THREAD_RUNNING,
72 THREAD_EXITED,
73};
74
a5321aa4 75struct thread_info*
4e1c45ea 76inferior_thread (void)
8601f500 77{
4e1c45ea
PA
78 struct thread_info *tp = find_thread_pid (inferior_ptid);
79 gdb_assert (tp);
80 return tp;
81}
8601f500 82
4e1c45ea
PA
83void
84delete_step_resume_breakpoint (struct thread_info *tp)
85{
86 if (tp && tp->step_resume_breakpoint)
8601f500 87 {
4e1c45ea
PA
88 delete_breakpoint (tp->step_resume_breakpoint);
89 tp->step_resume_breakpoint = NULL;
8601f500
MS
90 }
91}
92
7c952b6d 93static void
4f8d22e3 94clear_thread_inferior_resources (struct thread_info *tp)
7c952b6d
ND
95{
96 /* NOTE: this will take care of any left-over step_resume breakpoints,
4d8453a5
DJ
97 but not any user-specified thread-specific breakpoints. We can not
98 delete the breakpoint straight-off, because the inferior might not
99 be stopped at the moment. */
7c952b6d 100 if (tp->step_resume_breakpoint)
4f8d22e3
PA
101 {
102 tp->step_resume_breakpoint->disposition = disp_del_at_next_stop;
103 tp->step_resume_breakpoint = NULL;
104 }
7c952b6d 105
a474d7c2 106 bpstat_clear (&tp->stop_bpstat);
95e54da7
PA
107
108 discard_all_intermediate_continuations_thread (tp);
109 discard_all_continuations_thread (tp);
4f8d22e3
PA
110}
111
112static void
113free_thread (struct thread_info *tp)
114{
115 clear_thread_inferior_resources (tp);
a474d7c2 116
7c952b6d
ND
117 /* FIXME: do I ever need to call the back-end to give it a
118 chance at this private data before deleting the thread? */
119 if (tp->private)
b8c9b27d 120 xfree (tp->private);
7c952b6d 121
b8c9b27d 122 xfree (tp);
7c952b6d
ND
123}
124
c906108c 125void
fba45db2 126init_thread_list (void)
c906108c
SS
127{
128 struct thread_info *tp, *tpnext;
129
7c952b6d 130 highest_thread_num = 0;
8ea051c5 131
c906108c
SS
132 if (!thread_list)
133 return;
134
135 for (tp = thread_list; tp; tp = tpnext)
136 {
137 tpnext = tp->next;
7c952b6d 138 free_thread (tp);
c906108c
SS
139 }
140
141 thread_list = NULL;
c906108c
SS
142}
143
0d06e24b 144struct thread_info *
93815fbf 145add_thread_silent (ptid_t ptid)
c906108c
SS
146{
147 struct thread_info *tp;
148
4f8d22e3
PA
149 tp = find_thread_pid (ptid);
150 if (tp)
151 /* Found an old thread with the same id. It has to be dead,
152 otherwise we wouldn't be adding a new thread with the same id.
153 The OS is reusing this id --- delete it, and recreate a new
154 one. */
155 {
156 /* In addition to deleting the thread, if this is the current
dcf4fbde
PA
157 thread, then we need to take care that delete_thread doesn't
158 really delete the thread if it is inferior_ptid. Create a
159 new template thread in the list with an invalid ptid, switch
160 to it, delete the original thread, reset the new thread's
161 ptid, and switch to it. */
4f8d22e3
PA
162
163 if (ptid_equal (inferior_ptid, ptid))
164 {
165 tp = xmalloc (sizeof (*tp));
166 memset (tp, 0, sizeof (*tp));
167 tp->ptid = minus_one_ptid;
168 tp->num = ++highest_thread_num;
169 tp->next = thread_list;
170 thread_list = tp;
dcf4fbde
PA
171
172 /* Make switch_to_thread not read from the thread. */
173 tp->state_ = THREAD_EXITED;
174 switch_to_thread (minus_one_ptid);
4f8d22e3
PA
175
176 /* Now we can delete it. */
177 delete_thread (ptid);
178
dcf4fbde 179 /* Now reset its ptid, and reswitch inferior_ptid to it. */
4f8d22e3 180 tp->ptid = ptid;
dcf4fbde 181 tp->state_ = THREAD_STOPPED;
4f8d22e3
PA
182 switch_to_thread (ptid);
183
184 observer_notify_new_thread (tp);
185
186 /* All done. */
187 return tp;
188 }
189 else
190 /* Just go ahead and delete it. */
191 delete_thread (ptid);
192 }
193
6c0d3f6a
MS
194 tp = (struct thread_info *) xmalloc (sizeof (*tp));
195 memset (tp, 0, sizeof (*tp));
39f77062 196 tp->ptid = ptid;
c906108c 197 tp->num = ++highest_thread_num;
c906108c
SS
198 tp->next = thread_list;
199 thread_list = tp;
cfc01461
VP
200
201 observer_notify_new_thread (tp);
202
0d06e24b 203 return tp;
c906108c
SS
204}
205
93815fbf 206struct thread_info *
17faa917 207add_thread_with_info (ptid_t ptid, struct private_thread_info *private)
93815fbf
VP
208{
209 struct thread_info *result = add_thread_silent (ptid);
210
17faa917
DJ
211 result->private = private;
212
93815fbf 213 if (print_thread_events)
fd532e2e 214 printf_unfiltered (_("[New %s]\n"), target_pid_to_str (ptid));
d4fc5b1e
NR
215
216 annotate_new_thread ();
93815fbf
VP
217 return result;
218}
219
17faa917
DJ
220struct thread_info *
221add_thread (ptid_t ptid)
222{
223 return add_thread_with_info (ptid, NULL);
224}
225
5e0b29c1
PA
226/* Delete thread PTID. If SILENT, don't notify the observer of this
227 exit. */
228static void
229delete_thread_1 (ptid_t ptid, int silent)
c906108c
SS
230{
231 struct thread_info *tp, *tpprev;
232
233 tpprev = NULL;
234
235 for (tp = thread_list; tp; tpprev = tp, tp = tp->next)
39f77062 236 if (ptid_equal (tp->ptid, ptid))
c906108c
SS
237 break;
238
239 if (!tp)
240 return;
241
4f8d22e3
PA
242 /* If this is the current thread, or there's code out there that
243 relies on it existing (refcount > 0) we can't delete yet. Mark
244 it as exited, and notify it. */
245 if (tp->refcount > 0
246 || ptid_equal (tp->ptid, inferior_ptid))
247 {
248 if (tp->state_ != THREAD_EXITED)
249 {
a07daef3 250 observer_notify_thread_exit (tp, silent);
4f8d22e3
PA
251
252 /* Tag it as exited. */
253 tp->state_ = THREAD_EXITED;
254
255 /* Clear breakpoints, etc. associated with this thread. */
256 clear_thread_inferior_resources (tp);
257 }
258
259 /* Will be really deleted some other time. */
260 return;
261 }
262
c906108c
SS
263 if (tpprev)
264 tpprev->next = tp->next;
265 else
266 thread_list = tp->next;
267
4f8d22e3 268 /* Notify thread exit, but only if we haven't already. */
a07daef3
PA
269 if (tp->state_ != THREAD_EXITED)
270 observer_notify_thread_exit (tp, silent);
063bfe2e 271
7c952b6d 272 free_thread (tp);
c906108c
SS
273}
274
4f8d22e3
PA
275/* Delete thread PTID and notify of thread exit. If this is
276 inferior_ptid, don't actually delete it, but tag it as exited and
277 do the notification. If PTID is the user selected thread, clear
278 it. */
5e0b29c1
PA
279void
280delete_thread (ptid_t ptid)
281{
282 delete_thread_1 (ptid, 0 /* not silent */);
283}
284
285void
286delete_thread_silent (ptid_t ptid)
287{
288 delete_thread_1 (ptid, 1 /* silent */);
289}
290
1e92afda 291struct thread_info *
fba45db2 292find_thread_id (int num)
c906108c
SS
293{
294 struct thread_info *tp;
295
296 for (tp = thread_list; tp; tp = tp->next)
297 if (tp->num == num)
298 return tp;
299
300 return NULL;
301}
302
39f77062 303/* Find a thread_info by matching PTID. */
0d06e24b 304struct thread_info *
39f77062 305find_thread_pid (ptid_t ptid)
0d06e24b
JM
306{
307 struct thread_info *tp;
308
309 for (tp = thread_list; tp; tp = tp->next)
39f77062 310 if (ptid_equal (tp->ptid, ptid))
0d06e24b
JM
311 return tp;
312
313 return NULL;
314}
315
316/*
317 * Thread iterator function.
318 *
319 * Calls a callback function once for each thread, so long as
320 * the callback function returns false. If the callback function
321 * returns true, the iteration will end and the current thread
322 * will be returned. This can be useful for implementing a
323 * search for a thread with arbitrary attributes, or for applying
324 * some operation to every thread.
325 *
326 * FIXME: some of the existing functionality, such as
327 * "Thread apply all", might be rewritten using this functionality.
328 */
329
330struct thread_info *
fd118b61
KB
331iterate_over_threads (int (*callback) (struct thread_info *, void *),
332 void *data)
0d06e24b 333{
4f8d22e3 334 struct thread_info *tp, *next;
0d06e24b 335
4f8d22e3
PA
336 for (tp = thread_list; tp; tp = next)
337 {
338 next = tp->next;
339 if ((*callback) (tp, data))
340 return tp;
341 }
0d06e24b
JM
342
343 return NULL;
344}
345
20874c92
VP
346int
347thread_count (void)
348{
349 int result = 0;
350 struct thread_info *tp;
351
352 for (tp = thread_list; tp; tp = tp->next)
353 ++result;
354
355 return result;
356}
357
c906108c 358int
fba45db2 359valid_thread_id (int num)
c906108c
SS
360{
361 struct thread_info *tp;
362
363 for (tp = thread_list; tp; tp = tp->next)
364 if (tp->num == num)
365 return 1;
366
367 return 0;
368}
369
370int
39f77062 371pid_to_thread_id (ptid_t ptid)
c906108c
SS
372{
373 struct thread_info *tp;
374
375 for (tp = thread_list; tp; tp = tp->next)
39f77062 376 if (ptid_equal (tp->ptid, ptid))
c906108c
SS
377 return tp->num;
378
379 return 0;
380}
381
39f77062 382ptid_t
fba45db2 383thread_id_to_pid (int num)
c906108c
SS
384{
385 struct thread_info *thread = find_thread_id (num);
386 if (thread)
39f77062 387 return thread->ptid;
c906108c 388 else
39f77062 389 return pid_to_ptid (-1);
c906108c
SS
390}
391
392int
39f77062 393in_thread_list (ptid_t ptid)
c906108c
SS
394{
395 struct thread_info *tp;
396
397 for (tp = thread_list; tp; tp = tp->next)
39f77062 398 if (ptid_equal (tp->ptid, ptid))
c906108c
SS
399 return 1;
400
401 return 0; /* Never heard of 'im */
402}
8926118c 403
bad34192
PA
404/* Finds the first thread of the inferior given by PID. If PID is -1,
405 return the first thread in the list. */
406
407struct thread_info *
408first_thread_of_process (int pid)
409{
410 struct thread_info *tp, *ret = NULL;
411
412 for (tp = thread_list; tp; tp = tp->next)
413 if (pid == -1 || ptid_get_pid (tp->ptid) == pid)
414 if (ret == NULL || tp->num < ret->num)
415 ret = tp;
416
417 return ret;
418}
419
8b93c638
JM
420/* Print a list of thread ids currently known, and the total number of
421 threads. To be used from within catch_errors. */
6949171e
JJ
422static int
423do_captured_list_thread_ids (struct ui_out *uiout, void *arg)
8b93c638
JM
424{
425 struct thread_info *tp;
426 int num = 0;
3b31d625 427 struct cleanup *cleanup_chain;
592375cd 428 int current_thread = -1;
8b93c638 429
7990a578
EZ
430 prune_threads ();
431 target_find_new_threads ();
432
3b31d625 433 cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "thread-ids");
8b93c638
JM
434
435 for (tp = thread_list; tp; tp = tp->next)
436 {
4f8d22e3
PA
437 if (tp->state_ == THREAD_EXITED)
438 continue;
592375cd
VP
439
440 if (ptid_equal (tp->ptid, inferior_ptid))
441 current_thread = tp->num;
442
8b93c638
JM
443 num++;
444 ui_out_field_int (uiout, "thread-id", tp->num);
445 }
446
3b31d625 447 do_cleanups (cleanup_chain);
592375cd
VP
448
449 if (current_thread != -1)
450 ui_out_field_int (uiout, "current-thread-id", current_thread);
8b93c638
JM
451 ui_out_field_int (uiout, "number-of-threads", num);
452 return GDB_RC_OK;
453}
454
455/* Official gdblib interface function to get a list of thread ids and
456 the total number. */
457enum gdb_rc
ce43223b 458gdb_list_thread_ids (struct ui_out *uiout, char **error_message)
8b93c638 459{
b0b13bb4
DJ
460 if (catch_exceptions_with_msg (uiout, do_captured_list_thread_ids, NULL,
461 error_message, RETURN_MASK_ALL) < 0)
462 return GDB_RC_FAIL;
463 return GDB_RC_OK;
8b93c638 464}
c906108c 465
c906108c
SS
466/* Return true if TP is an active thread. */
467static int
fba45db2 468thread_alive (struct thread_info *tp)
c906108c 469{
4f8d22e3 470 if (tp->state_ == THREAD_EXITED)
c906108c 471 return 0;
39f77062 472 if (!target_thread_alive (tp->ptid))
4f8d22e3 473 return 0;
c906108c
SS
474 return 1;
475}
476
477static void
fba45db2 478prune_threads (void)
c906108c 479{
d4f3574e 480 struct thread_info *tp, *next;
c906108c 481
c906108c
SS
482 for (tp = thread_list; tp; tp = next)
483 {
484 next = tp->next;
485 if (!thread_alive (tp))
39f77062 486 delete_thread (tp->ptid);
c906108c
SS
487 }
488}
489
5231c1fd
PA
490void
491thread_change_ptid (ptid_t old_ptid, ptid_t new_ptid)
492{
82f73884
PA
493 struct inferior *inf;
494 struct thread_info *tp;
495
496 /* It can happen that what we knew as the target inferior id
497 changes. E.g, target remote may only discover the remote process
498 pid after adding the inferior to GDB's list. */
499 inf = find_inferior_pid (ptid_get_pid (old_ptid));
500 inf->pid = ptid_get_pid (new_ptid);
501
502 tp = find_thread_pid (old_ptid);
5231c1fd
PA
503 tp->ptid = new_ptid;
504
505 observer_notify_thread_ptid_changed (old_ptid, new_ptid);
506}
507
e1ac3328
VP
508void
509set_running (ptid_t ptid, int running)
510{
511 struct thread_info *tp;
512
e1ac3328
VP
513 /* We try not to notify the observer if no thread has actually changed
514 the running state -- merely to reduce the number of messages to
515 frontend. Frontend is supposed to handle multiple *running just fine. */
516 if (PIDGET (ptid) == -1)
517 {
518 int any_started = 0;
519 for (tp = thread_list; tp; tp = tp->next)
520 {
4f8d22e3
PA
521 if (tp->state_ == THREAD_EXITED)
522 continue;
523 if (running && tp->state_ == THREAD_STOPPED)
524 any_started = 1;
525 tp->state_ = running ? THREAD_RUNNING : THREAD_STOPPED;
e1ac3328 526 }
c5a4d20b
PA
527 if (any_started)
528 observer_notify_target_resumed (ptid);
e1ac3328
VP
529 }
530 else
531 {
4f8d22e3 532 int started = 0;
e1ac3328
VP
533 tp = find_thread_pid (ptid);
534 gdb_assert (tp);
4f8d22e3
PA
535 gdb_assert (tp->state_ != THREAD_EXITED);
536 if (running && tp->state_ == THREAD_STOPPED)
537 started = 1;
538 tp->state_ = running ? THREAD_RUNNING : THREAD_STOPPED;
c5a4d20b 539 if (started)
4f8d22e3
PA
540 observer_notify_target_resumed (ptid);
541 }
e1ac3328
VP
542}
543
4f8d22e3
PA
544static int
545is_thread_state (ptid_t ptid, enum thread_state state)
e1ac3328
VP
546{
547 struct thread_info *tp;
548
8ea051c5
PA
549 if (!target_has_execution)
550 return 0;
551
e1ac3328
VP
552 tp = find_thread_pid (ptid);
553 gdb_assert (tp);
4f8d22e3
PA
554 return tp->state_ == state;
555}
556
557int
558is_stopped (ptid_t ptid)
559{
560 /* Without execution, this property is always true. */
561 if (!target_has_execution)
562 return 1;
563
564 return is_thread_state (ptid, THREAD_STOPPED);
565}
566
567int
568is_exited (ptid_t ptid)
569{
570 /* Without execution, this property is always false. */
571 if (!target_has_execution)
572 return 0;
573
574 return is_thread_state (ptid, THREAD_EXITED);
575}
576
577int
578is_running (ptid_t ptid)
579{
580 /* Without execution, this property is always false. */
581 if (!target_has_execution)
582 return 0;
583
584 return is_thread_state (ptid, THREAD_RUNNING);
e1ac3328
VP
585}
586
8ea051c5
PA
587int
588any_running (void)
589{
590 struct thread_info *tp;
591
592 if (!target_has_execution)
593 return 0;
594
8ea051c5 595 for (tp = thread_list; tp; tp = tp->next)
4f8d22e3 596 if (tp->state_ == THREAD_RUNNING)
8ea051c5
PA
597 return 1;
598
599 return 0;
600}
601
602int
603is_executing (ptid_t ptid)
604{
605 struct thread_info *tp;
606
607 if (!target_has_execution)
608 return 0;
609
8ea051c5
PA
610 tp = find_thread_pid (ptid);
611 gdb_assert (tp);
612 return tp->executing_;
613}
614
615void
616set_executing (ptid_t ptid, int executing)
617{
618 struct thread_info *tp;
619
8ea051c5
PA
620 if (PIDGET (ptid) == -1)
621 {
622 for (tp = thread_list; tp; tp = tp->next)
623 tp->executing_ = executing;
624 }
625 else
626 {
627 tp = find_thread_pid (ptid);
628 gdb_assert (tp);
629 tp->executing_ = executing;
630 }
631}
632
252fbfc8
PA
633void
634set_stop_requested (ptid_t ptid, int stop)
635{
636 struct thread_info *tp;
637 int all = ptid_equal (ptid, minus_one_ptid);
638
639 if (all || ptid_is_pid (ptid))
640 {
641 for (tp = thread_list; tp; tp = tp->next)
642 if (all || ptid_get_pid (tp->ptid) == ptid_get_pid (ptid))
643 tp->stop_requested = stop;
644 }
645 else
646 {
647 tp = find_thread_pid (ptid);
648 gdb_assert (tp);
649 tp->stop_requested = stop;
650 }
651
652 /* Call the stop requested observer so other components of GDB can
653 react to this request. */
654 if (stop)
655 observer_notify_thread_stop_requested (ptid);
656}
657
29f49a6a
PA
658void
659finish_thread_state (ptid_t ptid)
660{
661 struct thread_info *tp;
662 int all;
663 int any_started = 0;
664
665 all = ptid_equal (ptid, minus_one_ptid);
666
667 if (all || ptid_is_pid (ptid))
668 {
669 for (tp = thread_list; tp; tp = tp->next)
670 {
671 if (tp->state_ == THREAD_EXITED)
672 continue;
673 if (all || ptid_get_pid (ptid) == ptid_get_pid (tp->ptid))
674 {
675 if (tp->executing_ && tp->state_ == THREAD_STOPPED)
676 any_started = 1;
677 tp->state_ = tp->executing_ ? THREAD_RUNNING : THREAD_STOPPED;
678 }
679 }
680 }
681 else
682 {
683 tp = find_thread_pid (ptid);
684 gdb_assert (tp);
685 if (tp->state_ != THREAD_EXITED)
686 {
687 if (tp->executing_ && tp->state_ == THREAD_STOPPED)
688 any_started = 1;
689 tp->state_ = tp->executing_ ? THREAD_RUNNING : THREAD_STOPPED;
690 }
691 }
692
693 if (any_started)
694 observer_notify_target_resumed (ptid);
695}
696
697void
698finish_thread_state_cleanup (void *arg)
699{
700 ptid_t *ptid_p = arg;
701
702 gdb_assert (arg);
703
704 finish_thread_state (*ptid_p);
705}
706
8e8901c5
VP
707/* Prints the list of threads and their details on UIOUT.
708 This is a version of 'info_thread_command' suitable for
709 use from MI.
4f8d22e3 710 If REQUESTED_THREAD is not -1, it's the GDB id of the thread
8e8901c5 711 that should be printed. Otherwise, all threads are
3ee1c036
VP
712 printed.
713 If PID is not -1, only print threads from the process PID.
714 Otherwise, threads from all attached PIDs are printed.
715 If both REQUESTED_THREAD and PID are not -1, then the thread
716 is printed if it belongs to the specified process. Otherwise,
717 an error is raised. */
8e8901c5 718void
3ee1c036 719print_thread_info (struct ui_out *uiout, int requested_thread, int pid)
c906108c
SS
720{
721 struct thread_info *tp;
39f77062 722 ptid_t current_ptid;
99b3d574 723 struct cleanup *old_chain;
0d06e24b 724 char *extra_info;
8e8901c5 725 int current_thread = -1;
c906108c 726
c906108c 727 prune_threads ();
b83266a0 728 target_find_new_threads ();
39f77062 729 current_ptid = inferior_ptid;
4f8d22e3
PA
730
731 /* We'll be switching threads temporarily. */
732 old_chain = make_cleanup_restore_current_thread ();
733
734 make_cleanup_ui_out_list_begin_end (uiout, "threads");
c906108c
SS
735 for (tp = thread_list; tp; tp = tp->next)
736 {
8e8901c5
VP
737 struct cleanup *chain2;
738
739 if (requested_thread != -1 && tp->num != requested_thread)
740 continue;
741
3ee1c036
VP
742 if (pid != -1 && PIDGET (tp->ptid) != pid)
743 {
744 if (requested_thread != -1)
745 error (_("Requested thread not found in requested process"));
746 continue;
747 }
748
4f8d22e3
PA
749 if (ptid_equal (tp->ptid, current_ptid))
750 current_thread = tp->num;
751
752 if (tp->state_ == THREAD_EXITED)
753 continue;
754
8e8901c5
VP
755 chain2 = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
756
39f77062 757 if (ptid_equal (tp->ptid, current_ptid))
4f8d22e3 758 ui_out_text (uiout, "* ");
c906108c 759 else
8e8901c5 760 ui_out_text (uiout, " ");
c906108c 761
8e8901c5
VP
762 ui_out_field_int (uiout, "id", tp->num);
763 ui_out_text (uiout, " ");
54ba13f7 764 ui_out_field_string (uiout, "target-id", target_pid_to_str (tp->ptid));
0d06e24b 765
ed406532
VP
766 extra_info = target_extra_thread_info (tp);
767 if (extra_info)
8e8901c5 768 {
ed406532
VP
769 ui_out_text (uiout, " (");
770 ui_out_field_string (uiout, "details", extra_info);
771 ui_out_text (uiout, ")");
8e8901c5 772 }
ed406532 773 ui_out_text (uiout, " ");
4f8d22e3
PA
774
775 if (tp->state_ == THREAD_RUNNING)
94cc34af
PA
776 ui_out_text (uiout, "(running)\n");
777 else
778 {
779 /* The switch below puts us at the top of the stack (leaf
780 frame). */
781 switch_to_thread (tp->ptid);
782 print_stack_frame (get_selected_frame (NULL),
783 /* For MI output, print frame level. */
784 ui_out_is_mi_like_p (uiout),
785 LOCATION);
786 }
8e8901c5 787
90139f7d
VP
788 if (ui_out_is_mi_like_p (uiout))
789 {
790 char *state = "stopped";
ed406532 791 if (tp->state_ == THREAD_RUNNING)
90139f7d
VP
792 state = "running";
793 ui_out_field_string (uiout, "state", state);
794 }
795
8e8901c5 796 do_cleanups (chain2);
c906108c
SS
797 }
798
99b3d574
DP
799 /* Restores the current thread and the frame selected before
800 the "info threads" command. */
801 do_cleanups (old_chain);
c906108c 802
d729566a 803 if (pid == -1 && requested_thread == -1)
8e8901c5 804 {
4f8d22e3 805 gdb_assert (current_thread != -1
d729566a
PA
806 || !thread_list
807 || ptid_equal (inferior_ptid, null_ptid));
0bcd3e20 808 if (current_thread != -1 && ui_out_is_mi_like_p (uiout))
8e8901c5 809 ui_out_field_int (uiout, "current-thread-id", current_thread);
94cc34af 810
4f8d22e3
PA
811 if (current_thread != -1 && is_exited (current_ptid))
812 ui_out_message (uiout, 0, "\n\
813The current thread <Thread ID %d> has terminated. See `help thread'.\n",
814 current_thread);
d729566a
PA
815 else if (thread_list
816 && current_thread == -1
817 && ptid_equal (current_ptid, null_ptid))
818 ui_out_message (uiout, 0, "\n\
819No selected thread. See `help thread'.\n");
c906108c 820 }
c906108c
SS
821}
822
8e8901c5
VP
823
824/* Print information about currently known threads
825
826 * Note: this has the drawback that it _really_ switches
827 * threads, which frees the frame cache. A no-side
828 * effects info-threads command would be nicer.
829 */
830
831static void
832info_threads_command (char *arg, int from_tty)
833{
3ee1c036 834 print_thread_info (uiout, -1, -1);
8e8901c5
VP
835}
836
c906108c
SS
837/* Switch from one thread to another. */
838
6a6b96b9 839void
39f77062 840switch_to_thread (ptid_t ptid)
c906108c 841{
39f77062 842 if (ptid_equal (ptid, inferior_ptid))
c906108c
SS
843 return;
844
39f77062 845 inferior_ptid = ptid;
35f196d9 846 reinit_frame_cache ();
c906108c 847 registers_changed ();
94cc34af 848
4f8d22e3
PA
849 /* We don't check for is_stopped, because we're called at times
850 while in the TARGET_RUNNING state, e.g., while handling an
851 internal event. */
d729566a
PA
852 if (!ptid_equal (inferior_ptid, null_ptid)
853 && !is_exited (ptid)
854 && !is_executing (ptid))
fb14de7b 855 stop_pc = regcache_read_pc (get_thread_regcache (ptid));
94cc34af
PA
856 else
857 stop_pc = ~(CORE_ADDR) 0;
c906108c
SS
858}
859
860static void
39f77062 861restore_current_thread (ptid_t ptid)
c906108c 862{
dcf4fbde 863 switch_to_thread (ptid);
99b3d574
DP
864}
865
866static void
4f8d22e3 867restore_selected_frame (struct frame_id a_frame_id, int frame_level)
99b3d574 868{
4f8d22e3
PA
869 struct frame_info *frame = NULL;
870 int count;
871
872 gdb_assert (frame_level >= 0);
873
874 /* Restore by level first, check if the frame id is the same as
875 expected. If that fails, try restoring by frame id. If that
876 fails, nothing to do, just warn the user. */
877
878 count = frame_level;
879 frame = find_relative_frame (get_current_frame (), &count);
880 if (count == 0
881 && frame != NULL
882 /* Either the frame ids match, of they're both invalid. The
883 latter case is not failsafe, but since it's highly unlikely
884 the search by level finds the wrong frame, it's 99.9(9)% of
885 the time (for all practical purposes) safe. */
886 && (frame_id_eq (get_frame_id (frame), a_frame_id)
887 /* Note: could be better to check every frame_id
888 member for equality here. */
889 || (!frame_id_p (get_frame_id (frame))
890 && !frame_id_p (a_frame_id))))
891 {
892 /* Cool, all is fine. */
893 select_frame (frame);
894 return;
895 }
99b3d574 896
4f8d22e3
PA
897 frame = frame_find_by_id (a_frame_id);
898 if (frame != NULL)
899 {
900 /* Cool, refound it. */
901 select_frame (frame);
902 return;
903 }
99b3d574 904
0c501536
PA
905 /* Nothing else to do, the frame layout really changed. Select the
906 innermost stack frame. */
907 select_frame (get_current_frame ());
908
909 /* Warn the user. */
4f8d22e3 910 if (!ui_out_is_mi_like_p (uiout))
99b3d574 911 {
4f8d22e3
PA
912 warning (_("\
913Couldn't restore frame #%d in current thread, at reparsed frame #0\n"),
914 frame_level);
915 /* For MI, we should probably have a notification about
916 current frame change. But this error is not very
917 likely, so don't bother for now. */
0c501536 918 print_stack_frame (get_selected_frame (NULL), 1, SRC_LINE);
c906108c
SS
919 }
920}
921
6ecce94d
AC
922struct current_thread_cleanup
923{
39f77062 924 ptid_t inferior_ptid;
99b3d574 925 struct frame_id selected_frame_id;
4f8d22e3
PA
926 int selected_frame_level;
927 int was_stopped;
6ecce94d
AC
928};
929
930static void
931do_restore_current_thread_cleanup (void *arg)
932{
4f8d22e3 933 struct thread_info *tp;
6ecce94d 934 struct current_thread_cleanup *old = arg;
d729566a
PA
935
936 tp = find_thread_pid (old->inferior_ptid);
937
938 /* If the previously selected thread belonged to a process that has
939 in the mean time been deleted (due to normal exit, detach, etc.),
940 then don't revert back to it, but instead simply drop back to no
941 thread selected. */
942 if (tp
88fc996f 943 && find_inferior_pid (ptid_get_pid (tp->ptid)) != NULL)
d729566a 944 restore_current_thread (old->inferior_ptid);
88fc996f
DE
945 else
946 restore_current_thread (null_ptid);
94cc34af 947
4f8d22e3
PA
948 /* The running state of the originally selected thread may have
949 changed, so we have to recheck it here. */
d729566a
PA
950 if (!ptid_equal (inferior_ptid, null_ptid)
951 && old->was_stopped
4f8d22e3
PA
952 && is_stopped (inferior_ptid)
953 && target_has_registers
954 && target_has_stack
955 && target_has_memory)
956 restore_selected_frame (old->selected_frame_id,
957 old->selected_frame_level);
958}
959
960static void
961restore_current_thread_cleanup_dtor (void *arg)
962{
963 struct current_thread_cleanup *old = arg;
964 struct thread_info *tp;
965 tp = find_thread_pid (old->inferior_ptid);
966 if (tp)
967 tp->refcount--;
b8c9b27d 968 xfree (old);
6ecce94d
AC
969}
970
6208b47d 971struct cleanup *
4f8d22e3 972make_cleanup_restore_current_thread (void)
6ecce94d 973{
4f8d22e3
PA
974 struct thread_info *tp;
975 struct frame_info *frame;
976 struct current_thread_cleanup *old;
977
978 old = xmalloc (sizeof (struct current_thread_cleanup));
39f77062 979 old->inferior_ptid = inferior_ptid;
4f8d22e3 980
d729566a
PA
981 if (!ptid_equal (inferior_ptid, null_ptid))
982 {
983 old->was_stopped = is_stopped (inferior_ptid);
984 if (old->was_stopped
985 && target_has_registers
986 && target_has_stack
987 && target_has_memory)
988 frame = get_selected_frame (NULL);
989 else
990 frame = NULL;
4f8d22e3 991
d729566a
PA
992 old->selected_frame_id = get_frame_id (frame);
993 old->selected_frame_level = frame_relative_level (frame);
994
995 tp = find_thread_pid (inferior_ptid);
996 if (tp)
997 tp->refcount++;
998 }
4f8d22e3
PA
999
1000 return make_cleanup_dtor (do_restore_current_thread_cleanup, old,
1001 restore_current_thread_cleanup_dtor);
6ecce94d
AC
1002}
1003
c906108c
SS
1004/* Apply a GDB command to a list of threads. List syntax is a whitespace
1005 seperated list of numbers, or ranges, or the keyword `all'. Ranges consist
1006 of two numbers seperated by a hyphen. Examples:
1007
c5aa993b
JM
1008 thread apply 1 2 7 4 backtrace Apply backtrace cmd to threads 1,2,7,4
1009 thread apply 2-7 9 p foo(1) Apply p foo(1) cmd to threads 2->7 & 9
1010 thread apply all p x/i $pc Apply x/i $pc cmd to all threads
1011 */
c906108c
SS
1012
1013static void
fba45db2 1014thread_apply_all_command (char *cmd, int from_tty)
c906108c
SS
1015{
1016 struct thread_info *tp;
4f8d22e3 1017 struct cleanup *old_chain;
e35ce267 1018 char *saved_cmd;
c906108c
SS
1019
1020 if (cmd == NULL || *cmd == '\000')
8a3fe4f8 1021 error (_("Please specify a command following the thread ID list"));
94cc34af 1022
4f8d22e3 1023 prune_threads ();
e9d196c5
MS
1024 target_find_new_threads ();
1025
4f8d22e3
PA
1026 old_chain = make_cleanup_restore_current_thread ();
1027
e35ce267
CF
1028 /* Save a copy of the command in case it is clobbered by
1029 execute_command */
5b616ba1 1030 saved_cmd = xstrdup (cmd);
94cc34af 1031 make_cleanup (xfree, saved_cmd);
c906108c
SS
1032 for (tp = thread_list; tp; tp = tp->next)
1033 if (thread_alive (tp))
1034 {
dcf4fbde 1035 switch_to_thread (tp->ptid);
94cc34af 1036
a3f17187 1037 printf_filtered (_("\nThread %d (%s):\n"),
54ba13f7 1038 tp->num, target_pid_to_str (inferior_ptid));
c906108c 1039 execute_command (cmd, from_tty);
6949171e 1040 strcpy (cmd, saved_cmd); /* Restore exact command used previously */
c906108c 1041 }
6ecce94d
AC
1042
1043 do_cleanups (old_chain);
c906108c
SS
1044}
1045
1046static void
fba45db2 1047thread_apply_command (char *tidlist, int from_tty)
c906108c
SS
1048{
1049 char *cmd;
1050 char *p;
1051 struct cleanup *old_chain;
e35ce267 1052 char *saved_cmd;
c906108c
SS
1053
1054 if (tidlist == NULL || *tidlist == '\000')
8a3fe4f8 1055 error (_("Please specify a thread ID list"));
c906108c 1056
c5aa993b 1057 for (cmd = tidlist; *cmd != '\000' && !isalpha (*cmd); cmd++);
c906108c
SS
1058
1059 if (*cmd == '\000')
8a3fe4f8 1060 error (_("Please specify a command following the thread ID list"));
c906108c 1061
e35ce267
CF
1062 /* Save a copy of the command in case it is clobbered by
1063 execute_command */
5b616ba1 1064 saved_cmd = xstrdup (cmd);
4f8d22e3 1065 old_chain = make_cleanup (xfree, saved_cmd);
c906108c
SS
1066 while (tidlist < cmd)
1067 {
1068 struct thread_info *tp;
1069 int start, end;
1070
1071 start = strtol (tidlist, &p, 10);
1072 if (p == tidlist)
8a3fe4f8 1073 error (_("Error parsing %s"), tidlist);
c906108c
SS
1074 tidlist = p;
1075
1076 while (*tidlist == ' ' || *tidlist == '\t')
1077 tidlist++;
1078
1079 if (*tidlist == '-') /* Got a range of IDs? */
1080 {
c5aa993b 1081 tidlist++; /* Skip the - */
c906108c
SS
1082 end = strtol (tidlist, &p, 10);
1083 if (p == tidlist)
8a3fe4f8 1084 error (_("Error parsing %s"), tidlist);
c906108c
SS
1085 tidlist = p;
1086
1087 while (*tidlist == ' ' || *tidlist == '\t')
1088 tidlist++;
1089 }
1090 else
1091 end = start;
1092
65fc9b77
PA
1093 make_cleanup_restore_current_thread ();
1094
c906108c
SS
1095 for (; start <= end; start++)
1096 {
1097 tp = find_thread_id (start);
1098
1099 if (!tp)
8a3fe4f8 1100 warning (_("Unknown thread %d."), start);
c906108c 1101 else if (!thread_alive (tp))
8a3fe4f8 1102 warning (_("Thread %d has terminated."), start);
c906108c
SS
1103 else
1104 {
dcf4fbde 1105 switch_to_thread (tp->ptid);
4f8d22e3 1106
a3f17187 1107 printf_filtered (_("\nThread %d (%s):\n"), tp->num,
54ba13f7 1108 target_pid_to_str (inferior_ptid));
c906108c 1109 execute_command (cmd, from_tty);
4f8d22e3
PA
1110
1111 /* Restore exact command used previously. */
1112 strcpy (cmd, saved_cmd);
c906108c
SS
1113 }
1114 }
1115 }
6ecce94d
AC
1116
1117 do_cleanups (old_chain);
c906108c
SS
1118}
1119
1120/* Switch to the specified thread. Will dispatch off to thread_apply_command
1121 if prefix of arg is `apply'. */
1122
1123static void
fba45db2 1124thread_command (char *tidstr, int from_tty)
c906108c 1125{
c906108c
SS
1126 if (!tidstr)
1127 {
d729566a
PA
1128 if (ptid_equal (inferior_ptid, null_ptid))
1129 error (_("No thread selected"));
1130
c906108c 1131 if (target_has_stack)
4f8d22e3
PA
1132 {
1133 if (is_exited (inferior_ptid))
1134 printf_filtered (_("[Current thread is %d (%s) (exited)]\n"),
1135 pid_to_thread_id (inferior_ptid),
54ba13f7 1136 target_pid_to_str (inferior_ptid));
4f8d22e3
PA
1137 else
1138 printf_filtered (_("[Current thread is %d (%s)]\n"),
1139 pid_to_thread_id (inferior_ptid),
54ba13f7 1140 target_pid_to_str (inferior_ptid));
4f8d22e3 1141 }
c906108c 1142 else
8a3fe4f8 1143 error (_("No stack."));
c906108c
SS
1144 return;
1145 }
c5394b80 1146
ce43223b 1147 gdb_thread_select (uiout, tidstr, NULL);
c5394b80
JM
1148}
1149
93815fbf
VP
1150/* Print notices when new threads are attached and detached. */
1151int print_thread_events = 1;
1152static void
1153show_print_thread_events (struct ui_file *file, int from_tty,
1154 struct cmd_list_element *c, const char *value)
1155{
1156 fprintf_filtered (file, _("\
1157Printing of thread events is %s.\n"),
1158 value);
1159}
1160
c5394b80 1161static int
6949171e 1162do_captured_thread_select (struct ui_out *uiout, void *tidstr)
c5394b80
JM
1163{
1164 int num;
1165 struct thread_info *tp;
1166
81490ea1 1167 num = value_as_long (parse_and_eval (tidstr));
c906108c
SS
1168
1169 tp = find_thread_id (num);
1170
8b93c638 1171 if (!tp)
8a3fe4f8 1172 error (_("Thread ID %d not known."), num);
c906108c
SS
1173
1174 if (!thread_alive (tp))
8a3fe4f8 1175 error (_("Thread ID %d has terminated."), num);
c906108c 1176
dcf4fbde 1177 switch_to_thread (tp->ptid);
c906108c 1178
db5a7484
NR
1179 annotate_thread_changed ();
1180
8b93c638 1181 ui_out_text (uiout, "[Switching to thread ");
39f77062 1182 ui_out_field_int (uiout, "new-thread-id", pid_to_thread_id (inferior_ptid));
8b93c638 1183 ui_out_text (uiout, " (");
54ba13f7 1184 ui_out_text (uiout, target_pid_to_str (inferior_ptid));
8b93c638 1185 ui_out_text (uiout, ")]");
c5394b80 1186
4f8d22e3
PA
1187 /* Note that we can't reach this with an exited thread, due to the
1188 thread_alive check above. */
1189 if (tp->state_ == THREAD_RUNNING)
94cc34af 1190 ui_out_text (uiout, "(running)\n");
4f8d22e3
PA
1191 else
1192 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
1193
1194 /* Since the current thread may have changed, see if there is any
1195 exited thread we can now delete. */
1196 prune_threads ();
94cc34af 1197
c5394b80
JM
1198 return GDB_RC_OK;
1199}
1200
1201enum gdb_rc
ce43223b 1202gdb_thread_select (struct ui_out *uiout, char *tidstr, char **error_message)
c5394b80 1203{
b0b13bb4
DJ
1204 if (catch_exceptions_with_msg (uiout, do_captured_thread_select, tidstr,
1205 error_message, RETURN_MASK_ALL) < 0)
1206 return GDB_RC_FAIL;
1207 return GDB_RC_OK;
c906108c
SS
1208}
1209
1210/* Commands with a prefix of `thread'. */
1211struct cmd_list_element *thread_cmd_list = NULL;
1212
1213void
fba45db2 1214_initialize_thread (void)
c906108c
SS
1215{
1216 static struct cmd_list_element *thread_apply_list = NULL;
c906108c 1217
d729566a
PA
1218 add_info ("threads", info_threads_command,
1219 _("IDs of currently known threads."));
c906108c 1220
d729566a 1221 add_prefix_cmd ("thread", class_run, thread_command, _("\
1bedd215
AC
1222Use this command to switch between threads.\n\
1223The new thread ID must be currently known."),
d729566a 1224 &thread_cmd_list, "thread ", 1, &cmdlist);
c906108c 1225
d729566a
PA
1226 add_prefix_cmd ("apply", class_run, thread_apply_command,
1227 _("Apply a command to a list of threads."),
1228 &thread_apply_list, "thread apply ", 1, &thread_cmd_list);
c906108c 1229
d729566a
PA
1230 add_cmd ("all", class_run, thread_apply_all_command,
1231 _("Apply a command to all threads."), &thread_apply_list);
c906108c
SS
1232
1233 if (!xdb_commands)
1234 add_com_alias ("t", "thread", class_run, 1);
93815fbf
VP
1235
1236 add_setshow_boolean_cmd ("thread-events", no_class,
1237 &print_thread_events, _("\
11c68c47
EZ
1238Set printing of thread events (such as thread start and exit)."), _("\
1239Show printing of thread events (such as thread start and exit)."), NULL,
93815fbf
VP
1240 NULL,
1241 show_print_thread_events,
1242 &setprintlist, &showprintlist);
c906108c 1243}