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