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