Reviewed and approved by Kevin Buettner <kevinb@redhat.com>
[deliverable/binutils-gdb.git] / gdb / lin-lwp.c
CommitLineData
8605d56e 1/* Multi-threaded debugging support for GNU/Linux (LWP layer).
4e052eda 2 Copyright 2000, 2001 Free Software Foundation, Inc.
fb0e1ba7
MK
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21#include "defs.h"
22
23#include "gdb_assert.h"
309367d4 24#include "gdb_string.h"
fb0e1ba7
MK
25#include <errno.h>
26#include <signal.h>
27#include <sys/ptrace.h>
28#include "gdb_wait.h"
29
30#include "gdbthread.h"
31#include "inferior.h"
32#include "target.h"
4e052eda 33#include "regcache.h"
7ca673cd 34#include "gdbcmd.h"
fb0e1ba7 35
7ca673cd 36static int debug_lin_lwp;
fb0e1ba7 37extern const char *strsignal (int sig);
fb0e1ba7 38
8605d56e
AC
39/* On GNU/Linux there are no real LWP's. The closest thing to LWP's
40 are processes sharing the same VM space. A multi-threaded process
41 is basically a group of such processes. However, such a grouping
42 is almost entirely a user-space issue; the kernel doesn't enforce
43 such a grouping at all (this might change in the future). In
44 general, we'll rely on the threads library (i.e. the GNU/Linux
45 Threads library) to provide such a grouping.
fb0e1ba7
MK
46
47 It is perfectly well possible to write a multi-threaded application
48 without the assistance of a threads library, by using the clone
49 system call directly. This module should be able to give some
50 rudimentary support for debugging such applications if developers
51 specify the CLONE_PTRACE flag in the clone system call, and are
8605d56e 52 using the Linux kernel 2.4 or above.
fb0e1ba7 53
8605d56e
AC
54 Note that there are some peculiarities in GNU/Linux that affect
55 this code:
fb0e1ba7
MK
56
57 - In general one should specify the __WCLONE flag to waitpid in
3f07c44b
MK
58 order to make it report events for any of the cloned processes
59 (and leave it out for the initial process). However, if a cloned
60 process has exited the exit status is only reported if the
8605d56e
AC
61 __WCLONE flag is absent. Linux kernel 2.4 has a __WALL flag, but
62 we cannot use it since GDB must work on older systems too.
fb0e1ba7
MK
63
64 - When a traced, cloned process exits and is waited for by the
4c8de859 65 debugger, the kernel reassigns it to the original parent and
8605d56e
AC
66 keeps it around as a "zombie". Somehow, the GNU/Linux Threads
67 library doesn't notice this, which leads to the "zombie problem":
68 When debugged a multi-threaded process that spawns a lot of
69 threads will run out of processes, even if the threads exit,
70 because the "zombies" stay around. */
fb0e1ba7
MK
71
72/* Structure describing a LWP. */
73struct lwp_info
74{
75 /* The process id of the LWP. This is a combination of the LWP id
76 and overall process id. */
39f77062 77 ptid_t ptid;
fb0e1ba7 78
cacab7c4
MK
79 /* Non-zero if this LWP is cloned. In this context "cloned" means
80 that the LWP is reporting to its parent using a signal other than
81 SIGCHLD. */
82 int cloned;
83
fb0e1ba7
MK
84 /* Non-zero if we sent this LWP a SIGSTOP (but the LWP didn't report
85 it back yet). */
86 int signalled;
87
88 /* Non-zero if this LWP is stopped. */
89 int stopped;
90
fce0e6e1
MK
91 /* Non-zero if this LWP will be/has been resumed. Note that an LWP
92 can be marked both as stopped and resumed at the same time. This
93 happens if we try to resume an LWP that has a wait status
94 pending. We shouldn't let the LWP run until that wait status has
95 been processed, but we should not report that wait status if GDB
96 didn't try to let the LWP run. */
97 int resumed;
98
fb0e1ba7
MK
99 /* If non-zero, a pending wait status. */
100 int status;
101
102 /* Non-zero if we were stepping this LWP. */
103 int step;
104
105 /* Next LWP in list. */
106 struct lwp_info *next;
107};
108
109/* List of known LWPs. */
110static struct lwp_info *lwp_list;
111
112/* Number of LWPs in the list. */
113static int num_lwps;
114
115/* Non-zero if we're running in "threaded" mode. */
116static int threaded;
117\f
118
ca6724c1
KB
119#define GET_LWP(ptid) ptid_get_lwp (ptid)
120#define GET_PID(ptid) ptid_get_pid (ptid)
121#define is_lwp(ptid) (GET_LWP (ptid) != 0)
122#define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
fb0e1ba7 123
fb0e1ba7
MK
124/* If the last reported event was a SIGTRAP, this variable is set to
125 the process id of the LWP/thread that got it. */
39f77062 126ptid_t trap_ptid;
fb0e1ba7
MK
127\f
128
129/* This module's target-specific operations. */
130static struct target_ops lin_lwp_ops;
131
132/* The standard child operations. */
133extern struct target_ops child_ops;
134
3f07c44b
MK
135/* Since we cannot wait (in lin_lwp_wait) for the initial process and
136 any cloned processes with a single call to waitpid, we have to use
4c8de859 137 the WNOHANG flag and call waitpid in a loop. To optimize
3f07c44b
MK
138 things a bit we use `sigsuspend' to wake us up when a process has
139 something to report (it will send us a SIGCHLD if it has). To make
140 this work we have to juggle with the signal mask. We save the
4c8de859 141 original signal mask such that we can restore it before creating a
3f07c44b
MK
142 new process in order to avoid blocking certain signals in the
143 inferior. We then block SIGCHLD during the waitpid/sigsuspend
144 loop. */
145
4c8de859 146/* Original signal mask. */
3f07c44b
MK
147static sigset_t normal_mask;
148
fb0e1ba7
MK
149/* Signal mask for use with sigsuspend in lin_lwp_wait, initialized in
150 _initialize_lin_lwp. */
151static sigset_t suspend_mask;
3f07c44b
MK
152
153/* Signals to block to make that sigsuspend work. */
154static sigset_t blocked_mask;
fb0e1ba7
MK
155\f
156
157/* Prototypes for local functions. */
c194fbe1 158static int stop_wait_callback (struct lwp_info *lp, void *data);
fb0e1ba7 159\f
58eeadba
MK
160/* Convert wait status STATUS to a string. Used for printing debug
161 messages only. */
fb0e1ba7 162
58eeadba
MK
163static char *
164status_to_str (int status)
165{
166 static char buf[64];
167
168 if (WIFSTOPPED (status))
169 snprintf (buf, sizeof (buf), "%s (stopped)",
170 strsignal (WSTOPSIG (status)));
171 else if (WIFSIGNALED (status))
172 snprintf (buf, sizeof (buf), "%s (terminated)",
173 strsignal (WSTOPSIG (status)));
174 else
175 snprintf (buf, sizeof (buf), "%d (exited)",
176 WEXITSTATUS (status));
177
178 return buf;
179}
180\f
c194fbe1
MK
181/* Initialize the list of LWPs. Note that this module, contrary to
182 what GDB's generic threads layer does for its thread list,
183 re-initializes the LWP lists whenever we mourn or detach (which
184 doesn't involve mourning) the inferior. */
fb0e1ba7
MK
185
186static void
187init_lwp_list (void)
188{
189 struct lwp_info *lp, *lpnext;
190
191 for (lp = lwp_list; lp; lp = lpnext)
192 {
193 lpnext = lp->next;
b8c9b27d 194 xfree (lp);
fb0e1ba7
MK
195 }
196
197 lwp_list = NULL;
198 num_lwps = 0;
199 threaded = 0;
200}
201
202/* Add the LWP specified by PID to the list. If this causes the
203 number of LWPs to become larger than one, go into "threaded" mode.
204 Return a pointer to the structure describing the new LWP. */
205
206static struct lwp_info *
39f77062 207add_lwp (ptid_t ptid)
fb0e1ba7
MK
208{
209 struct lwp_info *lp;
210
39f77062 211 gdb_assert (is_lwp (ptid));
fb0e1ba7
MK
212
213 lp = (struct lwp_info *) xmalloc (sizeof (struct lwp_info));
214
215 memset (lp, 0, sizeof (struct lwp_info));
216
39f77062 217 lp->ptid = ptid;
fb0e1ba7
MK
218
219 lp->next = lwp_list;
220 lwp_list = lp;
221 if (++num_lwps > 1)
222 threaded = 1;
223
224 return lp;
225}
226
227/* Remove the LWP specified by PID from the list. */
228
229static void
39f77062 230delete_lwp (ptid_t ptid)
fb0e1ba7
MK
231{
232 struct lwp_info *lp, *lpprev;
233
234 lpprev = NULL;
235
236 for (lp = lwp_list; lp; lpprev = lp, lp = lp->next)
39f77062 237 if (ptid_equal (lp->ptid, ptid))
fb0e1ba7
MK
238 break;
239
240 if (!lp)
241 return;
242
243 /* We don't go back to "non-threaded" mode if the number of threads
244 becomes less than two. */
245 num_lwps--;
246
247 if (lpprev)
248 lpprev->next = lp->next;
249 else
250 lwp_list = lp->next;
251
b8c9b27d 252 xfree (lp);
fb0e1ba7
MK
253}
254
255/* Return a pointer to the structure describing the LWP corresponding
256 to PID. If no corresponding LWP could be found, return NULL. */
257
258static struct lwp_info *
39f77062 259find_lwp_pid (ptid_t ptid)
fb0e1ba7
MK
260{
261 struct lwp_info *lp;
39f77062 262 int lwp;
fb0e1ba7 263
39f77062
KB
264 if (is_lwp (ptid))
265 lwp = GET_LWP (ptid);
266 else
267 lwp = GET_PID (ptid);
fb0e1ba7
MK
268
269 for (lp = lwp_list; lp; lp = lp->next)
39f77062 270 if (lwp == GET_LWP (lp->ptid))
fb0e1ba7
MK
271 return lp;
272
273 return NULL;
274}
275
276/* Call CALLBACK with its second argument set to DATA for every LWP in
277 the list. If CALLBACK returns 1 for a particular LWP, return a
278 pointer to the structure describing that LWP immediately.
279 Otherwise return NULL. */
280
281struct lwp_info *
282iterate_over_lwps (int (*callback) (struct lwp_info *, void *), void *data)
283{
fce0e6e1 284 struct lwp_info *lp, *lpnext;
fb0e1ba7 285
fce0e6e1
MK
286 for (lp = lwp_list; lp; lp = lpnext)
287 {
288 lpnext = lp->next;
289 if ((*callback) (lp, data))
290 return lp;
291 }
fb0e1ba7
MK
292
293 return NULL;
294}
295\f
296
8605d56e 297/* Implementation of the PREPARE_TO_PROCEED hook for the GNU/Linux LWP
e02bc4cc
DS
298 layer.
299
300 Note that this implementation is potentially redundant now that
8849f47d
JL
301 default_prepare_to_proceed() has been added.
302
303 FIXME This may not support switching threads after Ctrl-C
304 correctly. The default implementation does support this. */
fb0e1ba7
MK
305
306int
307lin_lwp_prepare_to_proceed (void)
308{
39f77062
KB
309 if (! ptid_equal (trap_ptid, null_ptid)
310 && ! ptid_equal (inferior_ptid, trap_ptid))
fb0e1ba7
MK
311 {
312 /* Switched over from TRAP_PID. */
313 CORE_ADDR stop_pc = read_pc ();
314 CORE_ADDR trap_pc;
315
316 /* Avoid switching where it wouldn't do any good, i.e. if both
317 threads are at the same breakpoint. */
39f77062 318 trap_pc = read_pc_pid (trap_ptid);
fb0e1ba7
MK
319 if (trap_pc != stop_pc && breakpoint_here_p (trap_pc))
320 {
321 /* User hasn't deleted the breakpoint. Return non-zero, and
322 switch back to TRAP_PID. */
39f77062 323 inferior_ptid = trap_ptid;
fb0e1ba7
MK
324
325 /* FIXME: Is this stuff really necessary? */
326 flush_cached_frames ();
327 registers_changed ();
328
329 return 1;
330 }
331 }
332
333 return 0;
334}
335\f
336
337#if 0
338static void
339lin_lwp_open (char *args, int from_tty)
340{
341 push_target (&lin_lwp_ops);
342}
343#endif
344
345/* Attach to the LWP specified by PID. If VERBOSE is non-zero, print
346 a message telling the user that a new LWP has been added to the
347 process. */
348
349void
39f77062 350lin_lwp_attach_lwp (ptid_t ptid, int verbose)
fb0e1ba7
MK
351{
352 struct lwp_info *lp;
353
39f77062 354 gdb_assert (is_lwp (ptid));
fb0e1ba7 355
da9c7185
KB
356 /* Make sure SIGCHLD is blocked. We don't want SIGCHLD events
357 to interrupt either the ptrace() or waitpid() calls below. */
358 if (! sigismember (&blocked_mask, SIGCHLD))
359 {
360 sigaddset (&blocked_mask, SIGCHLD);
361 sigprocmask (SIG_BLOCK, &blocked_mask, NULL);
362 }
363
fb0e1ba7 364 if (verbose)
39f77062 365 printf_filtered ("[New %s]\n", target_pid_to_str (ptid));
fb0e1ba7 366
c194fbe1
MK
367 lp = find_lwp_pid (ptid);
368 if (lp == NULL)
369 lp = add_lwp (ptid);
370
cacab7c4
MK
371 /* We assume that we're already attached to any LWP that has an
372 id equal to the overall process id. */
373 if (GET_LWP (ptid) != GET_PID (ptid))
c4365b19 374 {
cacab7c4
MK
375 pid_t pid;
376 int status;
377
378 if (ptrace (PTRACE_ATTACH, GET_LWP (ptid), 0, 0) < 0)
379 error ("Can't attach %s: %s", target_pid_to_str (ptid),
dc672865 380 safe_strerror (errno));
cacab7c4
MK
381
382 pid = waitpid (GET_LWP (ptid), &status, 0);
383 if (pid == -1 && errno == ECHILD)
384 {
385 /* Try again with __WCLONE to check cloned processes. */
386 pid = waitpid (GET_LWP (ptid), &status, __WCLONE);
387 lp->cloned = 1;
388 }
389
390 gdb_assert (pid == GET_LWP (ptid)
391 && WIFSTOPPED (status) && WSTOPSIG (status));
392
393 lp->stopped = 1;
c4365b19 394 }
da9c7185
KB
395 else
396 {
397 /* We assume that the LWP representing the original process
398 is already stopped. Mark it as stopped in the data structure
399 that the lin-lwp layer uses to keep track of threads. Note
400 that this won't have already been done since the main thread
401 will have, we assume, been stopped by an attach from a
402 different layer. */
403 lp->stopped = 1;
404 }
fb0e1ba7
MK
405}
406
407static void
408lin_lwp_attach (char *args, int from_tty)
409{
c194fbe1 410 struct lwp_info *lp;
cacab7c4
MK
411 pid_t pid;
412 int status;
c194fbe1 413
fb0e1ba7
MK
414 /* FIXME: We should probably accept a list of process id's, and
415 attach all of them. */
c194fbe1
MK
416 child_ops.to_attach (args, from_tty);
417
418 /* Add the initial process as the first LWP to the list. */
cacab7c4 419 lp = add_lwp (BUILD_LWP (GET_PID (inferior_ptid), GET_PID (inferior_ptid)));
c194fbe1
MK
420
421 /* Make sure the initial process is stopped. The user-level threads
422 layer might want to poke around in the inferior, and that won't
423 work if things haven't stabilized yet. */
cacab7c4
MK
424 pid = waitpid (GET_PID (inferior_ptid), &status, 0);
425 if (pid == -1 && errno == ECHILD)
426 {
427 warning ("%s is a cloned process", target_pid_to_str (inferior_ptid));
428
429 /* Try again with __WCLONE to check cloned processes. */
430 pid = waitpid (GET_PID (inferior_ptid), &status, __WCLONE);
431 lp->cloned = 1;
432 }
433
434 gdb_assert (pid == GET_PID (inferior_ptid)
435 && WIFSTOPPED (status) && WSTOPSIG (status) == SIGSTOP);
436
437 lp->stopped = 1;
c194fbe1
MK
438
439 /* Fake the SIGSTOP that core GDB expects. */
440 lp->status = W_STOPCODE (SIGSTOP);
fce0e6e1 441 lp->resumed = 1;
c194fbe1
MK
442}
443
444static int
445detach_callback (struct lwp_info *lp, void *data)
446{
447 gdb_assert (lp->status == 0 || WIFSTOPPED (lp->status));
448
449 if (debug_lin_lwp && lp->status)
b08cfdb6 450 fprintf_unfiltered (gdb_stdlog, "Pending %s for LWP %ld on detach.\n",
c194fbe1
MK
451 strsignal (WSTOPSIG (lp->status)), GET_LWP (lp->ptid));
452
453 while (lp->signalled && lp->stopped)
454 {
455 if (ptrace (PTRACE_CONT, GET_LWP (lp->ptid), 0,
456 WSTOPSIG (lp->status)) < 0)
457 error ("Can't continue %s: %s", target_pid_to_str (lp->ptid),
dc672865 458 safe_strerror (errno));
c194fbe1
MK
459
460 lp->stopped = 0;
c4365b19 461 lp->signalled = 0;
c194fbe1
MK
462 lp->status = 0;
463 stop_wait_callback (lp, NULL);
464
465 gdb_assert (lp->status == 0 || WIFSTOPPED (lp->status));
466 }
467
cacab7c4
MK
468 /* We don't actually detach from the LWP that has an id equal to the
469 overall process id just yet. */
470 if (GET_LWP (lp->ptid) != GET_PID (lp->ptid))
c194fbe1
MK
471 {
472 if (ptrace (PTRACE_DETACH, GET_LWP (lp->ptid), 0,
473 WSTOPSIG (lp->status)) < 0)
474 error ("Can't detach %s: %s", target_pid_to_str (lp->ptid),
dc672865 475 safe_strerror (errno));
c194fbe1
MK
476
477 delete_lwp (lp->ptid);
478 }
479
480 return 0;
fb0e1ba7
MK
481}
482
483static void
484lin_lwp_detach (char *args, int from_tty)
485{
c194fbe1
MK
486 iterate_over_lwps (detach_callback, NULL);
487
cacab7c4 488 /* Only the initial process should be left right now. */
c194fbe1
MK
489 gdb_assert (num_lwps == 1);
490
491 trap_ptid = null_ptid;
492
493 /* Destroy LWP info; it's no longer valid. */
494 init_lwp_list ();
495
496 /* Restore the original signal mask. */
497 sigprocmask (SIG_SETMASK, &normal_mask, NULL);
498 sigemptyset (&blocked_mask);
499
01263b57 500 inferior_ptid = pid_to_ptid (GET_PID (inferior_ptid));
c194fbe1 501 child_ops.to_detach (args, from_tty);
fb0e1ba7
MK
502}
503\f
504
505struct private_thread_info
506{
507 int lwpid;
508};
509
510/* Return non-zero if TP corresponds to the LWP specified by DATA
511 (which is assumed to be a pointer to a `struct lwp_info'. */
512
513static int
514find_lwp_callback (struct thread_info *tp, void *data)
515{
516 struct lwp_info *lp = data;
517
39f77062 518 if (tp->private->lwpid == GET_LWP (lp->ptid))
fb0e1ba7
MK
519 return 1;
520
521 return 0;
522}
523
524/* Resume LP. */
525
526static int
527resume_callback (struct lwp_info *lp, void *data)
528{
529 if (lp->stopped && lp->status == 0)
530 {
531 struct thread_info *tp;
532
b1aeb4c5 533#if 0
fb0e1ba7
MK
534 /* FIXME: kettenis/2000-08-26: This should really be handled
535 properly by core GDB. */
536
39f77062 537 tp = find_thread_pid (lp->ptid);
fb0e1ba7
MK
538 if (tp == NULL)
539 tp = iterate_over_threads (find_lwp_callback, lp);
540 gdb_assert (tp);
541
542 /* If we were previously stepping the thread, and now continue
543 the thread we must invalidate the stepping range. However,
544 if there is a step_resume breakpoint for this thread, we must
545 preserve the stepping range to make it possible to continue
546 stepping once we hit it. */
547 if (tp->step_range_end && tp->step_resume_breakpoint == NULL)
548 {
549 gdb_assert (lp->step);
550 tp->step_range_start = tp->step_range_end = 0;
551 }
552#endif
553
39f77062 554 child_resume (pid_to_ptid (GET_LWP (lp->ptid)), 0, TARGET_SIGNAL_0);
fb0e1ba7
MK
555 lp->stopped = 0;
556 lp->step = 0;
557 }
558
559 return 0;
560}
561
fce0e6e1
MK
562static int
563resume_clear_callback (struct lwp_info *lp, void *data)
564{
565 lp->resumed = 0;
566 return 0;
567}
568
569static int
570resume_set_callback (struct lwp_info *lp, void *data)
571{
572 lp->resumed = 1;
573 return 0;
574}
575
fb0e1ba7 576static void
39f77062 577lin_lwp_resume (ptid_t ptid, int step, enum target_signal signo)
fb0e1ba7
MK
578{
579 struct lwp_info *lp;
580 int resume_all;
581
582 /* Apparently the interpretation of PID is dependent on STEP: If
583 STEP is non-zero, a specific PID means `step only this process
584 id'. But if STEP is zero, then PID means `continue *all*
585 processes, but give the signal only to this one'. */
39f77062 586 resume_all = (PIDGET (ptid) == -1) || !step;
fb0e1ba7 587
fce0e6e1
MK
588 if (resume_all)
589 iterate_over_lwps (resume_set_callback, NULL);
590 else
591 iterate_over_lwps (resume_clear_callback, NULL);
592
fb0e1ba7 593 /* If PID is -1, it's the current inferior that should be
c4365b19 594 handled specially. */
39f77062
KB
595 if (PIDGET (ptid) == -1)
596 ptid = inferior_ptid;
fb0e1ba7 597
39f77062 598 lp = find_lwp_pid (ptid);
fb0e1ba7
MK
599 if (lp)
600 {
39f77062 601 ptid = pid_to_ptid (GET_LWP (lp->ptid));
fb0e1ba7 602
fb0e1ba7
MK
603 /* Remember if we're stepping. */
604 lp->step = step;
605
fce0e6e1
MK
606 /* Mark this LWP as resumed. */
607 lp->resumed = 1;
608
fb0e1ba7
MK
609 /* If we have a pending wait status for this thread, there is no
610 point in resuming the process. */
611 if (lp->status)
612 {
613 /* FIXME: What should we do if we are supposed to continue
614 this thread with a signal? */
615 gdb_assert (signo == TARGET_SIGNAL_0);
616 return;
617 }
40564aca
MK
618
619 /* Mark LWP as not stopped to prevent it from being continued by
620 resume_callback. */
621 lp->stopped = 0;
fb0e1ba7
MK
622 }
623
624 if (resume_all)
625 iterate_over_lwps (resume_callback, NULL);
626
39f77062 627 child_resume (ptid, step, signo);
fb0e1ba7
MK
628}
629\f
630
631/* Send a SIGSTOP to LP. */
632
633static int
634stop_callback (struct lwp_info *lp, void *data)
635{
636 if (! lp->stopped && ! lp->signalled)
637 {
638 int ret;
639
39f77062 640 ret = kill (GET_LWP (lp->ptid), SIGSTOP);
fb0e1ba7
MK
641 gdb_assert (ret == 0);
642
643 lp->signalled = 1;
644 gdb_assert (lp->status == 0);
645 }
646
647 return 0;
648}
649
de4ca854
MK
650/* Wait until LP is stopped. If DATA is non-null it is interpreted as
651 a pointer to a set of signals to be flushed immediately. */
fb0e1ba7
MK
652
653static int
654stop_wait_callback (struct lwp_info *lp, void *data)
655{
de4ca854
MK
656 sigset_t *flush_mask = data;
657
fb0e1ba7
MK
658 if (! lp->stopped && lp->signalled)
659 {
660 pid_t pid;
661 int status;
662
663 gdb_assert (lp->status == 0);
664
cacab7c4 665 pid = waitpid (GET_LWP (lp->ptid), &status, lp->cloned ? __WCLONE : 0);
fb0e1ba7
MK
666 if (pid == -1 && errno == ECHILD)
667 /* OK, the proccess has disappeared. We'll catch the actual
3f07c44b 668 exit event in lin_lwp_wait. */
fb0e1ba7
MK
669 return 0;
670
39f77062 671 gdb_assert (pid == GET_LWP (lp->ptid));
fb0e1ba7
MK
672
673 if (WIFEXITED (status) || WIFSIGNALED (status))
674 {
675 gdb_assert (num_lwps > 1);
fb0e1ba7 676
39f77062 677 if (in_thread_list (lp->ptid))
e6328671
MK
678 {
679 /* Core GDB cannot deal with us deleting the current
680 thread. */
39f77062
KB
681 if (!ptid_equal (lp->ptid, inferior_ptid))
682 delete_thread (lp->ptid);
e6328671 683 printf_unfiltered ("[%s exited]\n",
39f77062 684 target_pid_to_str (lp->ptid));
e6328671 685 }
7ca673cd 686 if (debug_lin_lwp)
9085700c 687 fprintf_unfiltered (gdb_stdlog,
39f77062 688 "%s exited.\n", target_pid_to_str (lp->ptid));
7ca673cd 689
39f77062 690 delete_lwp (lp->ptid);
fb0e1ba7
MK
691 return 0;
692 }
693
694 gdb_assert (WIFSTOPPED (status));
fb0e1ba7 695
de4ca854
MK
696 /* Ignore any signals in FLUSH_MASK. */
697 if (flush_mask && sigismember (flush_mask, WSTOPSIG (status)))
698 {
699 ptrace (PTRACE_CONT, GET_LWP (lp->ptid), 0, 0);
700 return stop_wait_callback (lp, flush_mask);
701 }
702
fb0e1ba7
MK
703 if (WSTOPSIG (status) != SIGSTOP)
704 {
b1aeb4c5 705 if (WSTOPSIG (status) == SIGTRAP)
fb0e1ba7
MK
706 {
707 /* If a LWP other than the LWP that we're reporting an
708 event for has hit a GDB breakpoint (as opposed to
709 some random trap signal), then just arrange for it to
710 hit it again later. We don't keep the SIGTRAP status
711 and don't forward the SIGTRAP signal to the LWP. We
712 will handle the current event, eventually we will
713 resume all LWPs, and this one will get its breakpoint
714 trap again.
715
716 If we do not do this, then we run the risk that the
717 user will delete or disable the breakpoint, but the
718 thread will have already tripped on it. */
7ca673cd 719
c4365b19
MS
720 /* Now resume this LWP and get the SIGSTOP event. */
721 ptrace (PTRACE_CONT, GET_LWP (lp->ptid), 0, 0);
b1aeb4c5
MS
722 if (debug_lin_lwp)
723 {
724 fprintf_unfiltered (gdb_stderr,
725 "SWC: Candidate SIGTRAP event in %ld\n",
726 GET_LWP (lp->ptid));
727 }
728 /* Hold the SIGTRAP for handling by lin_lwp_wait. */
729 stop_wait_callback (lp, data);
730 /* If there's another event, throw it back into the queue. */
731 if (lp->status)
732 kill (GET_LWP (lp->ptid), WSTOPSIG (lp->status));
733 /* Save the sigtrap event. */
734 lp->status = status;
735 return 0;
fb0e1ba7
MK
736 }
737 else
738 {
b1aeb4c5
MS
739 /* The thread was stopped with a signal other than
740 SIGSTOP, and didn't accidentally trip a breakpoint. */
741
7ca673cd 742 if (debug_lin_lwp)
b1aeb4c5
MS
743 {
744 fprintf_unfiltered (gdb_stderr,
745 "SWC: Pending event %d in %ld\n",
746 WSTOPSIG (status), GET_LWP (lp->ptid));
747 }
748 /* Now resume this LWP and get the SIGSTOP event. */
749 ptrace (PTRACE_CONT, GET_LWP (lp->ptid), 0, 0);
7ca673cd 750
b1aeb4c5
MS
751 /* Hold this event/waitstatus while we check to see if
752 there are any more (we still want to get that SIGSTOP). */
753 stop_wait_callback (lp, data);
754 /* If the lp->status field is still empty, use it to hold
755 this event. If not, then this event must be returned
756 to the event queue of the LWP. */
757 if (lp->status == 0)
758 lp->status = status;
759 else
760 kill (GET_LWP (lp->ptid), WSTOPSIG (status));
761 return 0;
fb0e1ba7
MK
762 }
763 }
764 else
765 {
766 /* We caught the SIGSTOP that we intended to catch, so
767 there's no SIGSTOP pending. */
b1aeb4c5 768 lp->stopped = 1;
fb0e1ba7
MK
769 lp->signalled = 0;
770 }
771 }
772
773 return 0;
774}
775
776/* Return non-zero if LP has a wait status pending. */
777
778static int
779status_callback (struct lwp_info *lp, void *data)
780{
fce0e6e1
MK
781 /* Only report a pending wait status if we pretend that this has
782 indeed been resumed. */
783 return (lp->status != 0 && lp->resumed);
fb0e1ba7
MK
784}
785
786/* Return non-zero if LP isn't stopped. */
787
788static int
789running_callback (struct lwp_info *lp, void *data)
790{
791 return (lp->stopped == 0);
792}
793
00d4fce6 794/* Count the LWP's that have had events. */
b1aeb4c5
MS
795
796static int
797count_events_callback (struct lwp_info *lp, void *data)
798{
799 int *count = data;
800
00d4fce6
MK
801 gdb_assert (count != NULL);
802
803 /* Count only LWPs that have a SIGTRAP event pending. */
804 if (lp->status != 0
805 && WIFSTOPPED (lp->status) && WSTOPSIG (lp->status) == SIGTRAP)
b1aeb4c5
MS
806 (*count)++;
807
808 return 0;
809}
810
00d4fce6 811/* Select the LWP (if any) that is currently being single-stepped. */
b1aeb4c5
MS
812
813static int
814select_singlestep_lwp_callback (struct lwp_info *lp, void *data)
815{
816 if (lp->step && lp->status != 0)
817 return 1;
818 else
819 return 0;
820}
821
00d4fce6 822/* Select the Nth LWP that has had a SIGTRAP event. */
b1aeb4c5
MS
823
824static int
825select_event_lwp_callback (struct lwp_info *lp, void *data)
826{
827 int *selector = data;
828
00d4fce6
MK
829 gdb_assert (selector != NULL);
830
831 /* Select only LWPs that have a SIGTRAP event pending. */
832 if (lp->status != 0
833 && WIFSTOPPED (lp->status) && WSTOPSIG (lp->status) == SIGTRAP)
b1aeb4c5
MS
834 if ((*selector)-- == 0)
835 return 1;
836
837 return 0;
838}
839
840static int
841cancel_breakpoints_callback (struct lwp_info *lp, void *data)
842{
843 struct lwp_info *event_lp = data;
844
00d4fce6
MK
845 /* Leave the LWP that has been elected to receive a SIGTRAP alone. */
846 if (lp == event_lp)
847 return 0;
848
849 /* If a LWP other than the LWP that we're reporting an event for has
850 hit a GDB breakpoint (as opposed to some random trap signal),
851 then just arrange for it to hit it again later. We don't keep
852 the SIGTRAP status and don't forward the SIGTRAP signal to the
853 LWP. We will handle the current event, eventually we will resume
854 all LWPs, and this one will get its breakpoint trap again.
855
856 If we do not do this, then we run the risk that the user will
857 delete or disable the breakpoint, but the LWP will have already
858 tripped on it. */
859
860 if (lp->status != 0
861 && WIFSTOPPED (lp->status) && WSTOPSIG (lp->status) == SIGTRAP
862 && breakpoint_inserted_here_p (read_pc_pid (lp->ptid) -
863 DECR_PC_AFTER_BREAK))
b1aeb4c5
MS
864 {
865 if (debug_lin_lwp)
00d4fce6
MK
866 fprintf_unfiltered (gdb_stdlog,
867 "Push back breakpoint for LWP %ld\n",
868 GET_LWP (lp->ptid));
869
870 /* Back up the PC if necessary. */
b1aeb4c5 871 if (DECR_PC_AFTER_BREAK)
00d4fce6
MK
872 write_pc_pid (read_pc_pid (lp->ptid) - DECR_PC_AFTER_BREAK, lp->ptid);
873
874 /* Throw away the SIGTRAP. */
b1aeb4c5
MS
875 lp->status = 0;
876 }
00d4fce6 877
b1aeb4c5
MS
878 return 0;
879}
880
00d4fce6 881/* Select one LWP out of those that have events pending. */
b1aeb4c5
MS
882
883static void
884select_event_lwp (struct lwp_info **orig_lp, int *status)
885{
886 int num_events = 0;
887 int random_selector;
888 struct lwp_info *event_lp;
889
00d4fce6
MK
890 /* Record the wait status for the origional LWP. */
891 (*orig_lp)->status = *status;
892
893 /* Give preference to any LWP that is being single-stepped. */
b1aeb4c5
MS
894 event_lp = iterate_over_lwps (select_singlestep_lwp_callback, NULL);
895 if (event_lp != NULL)
896 {
897 if (debug_lin_lwp)
00d4fce6
MK
898 fprintf_unfiltered (gdb_stdlog,
899 "Select single-step LWP %ld\n",
b1aeb4c5
MS
900 GET_LWP (event_lp->ptid));
901 }
902 else
903 {
904 /* No single-stepping LWP. Select one at random, out of those
00d4fce6 905 which have had SIGTRAP events. */
b1aeb4c5 906
00d4fce6
MK
907 /* First see how many SIGTRAP events we have. */
908 iterate_over_lwps (count_events_callback, &num_events);
b1aeb4c5 909
00d4fce6
MK
910 /* Now randomly pick a LWP out of those that have had a SIGTRAP. */
911 random_selector = (int)
b1aeb4c5
MS
912 ((num_events * (double) rand ()) / (RAND_MAX + 1.0));
913
00d4fce6
MK
914 if (debug_lin_lwp && num_events > 1)
915 fprintf_unfiltered (gdb_stdlog,
916 "Found %d SIGTRAP events, selecting #%d\n",
917 num_events, random_selector);
b1aeb4c5 918
00d4fce6
MK
919 event_lp = iterate_over_lwps (select_event_lwp_callback,
920 &random_selector);
b1aeb4c5
MS
921 }
922
923 if (event_lp != NULL)
924 {
00d4fce6 925 /* Switch the event LWP. */
b1aeb4c5
MS
926 *orig_lp = event_lp;
927 *status = event_lp->status;
b1aeb4c5 928 }
00d4fce6
MK
929
930 /* Flush the wait status for the event LWP. */
931 (*orig_lp)->status = 0;
b1aeb4c5
MS
932}
933
fce0e6e1
MK
934/* Return non-zero if LP has been resumed. */
935
936static int
937resumed_callback (struct lwp_info *lp, void *data)
938{
939 return lp->resumed;
940}
941
cacab7c4
MK
942#ifdef CHILD_WAIT
943
944/* We need to override child_wait to support attaching to cloned
945 processes, since a normal wait (as done by the default version)
946 ignores those processes. */
947
948/* Wait for child PTID to do something. Return id of the child,
949 minus_one_ptid in case of error; store status into *OURSTATUS. */
950
951ptid_t
952child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
953{
954 int save_errno;
955 int status;
956 pid_t pid;
957
958 do
959 {
960 set_sigint_trap (); /* Causes SIGINT to be passed on to the
961 attached process. */
962 set_sigio_trap ();
963
964 pid = waitpid (GET_PID (ptid), &status, 0);
965 if (pid == -1 && errno == ECHILD)
966 /* Try again with __WCLONE to check cloned processes. */
967 pid = waitpid (GET_PID (ptid), &status, __WCLONE);
968 save_errno = errno;
969
970 clear_sigio_trap ();
971 clear_sigint_trap ();
972 }
2d1bfe2e 973 while (pid == -1 && save_errno == EINTR);
cacab7c4
MK
974
975 if (pid == -1)
976 {
dc672865 977 warning ("Child process unexpectedly missing: %s", safe_strerror (errno));
cacab7c4
MK
978
979 /* Claim it exited with unknown signal. */
980 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
981 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
982 return minus_one_ptid;
983 }
984
985 store_waitstatus (ourstatus, status);
986 return pid_to_ptid (pid);
987}
988
989#endif
990
39f77062
KB
991static ptid_t
992lin_lwp_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
fb0e1ba7
MK
993{
994 struct lwp_info *lp = NULL;
995 int options = 0;
996 int status = 0;
39f77062 997 pid_t pid = PIDGET (ptid);
de4ca854
MK
998 sigset_t flush_mask;
999
1000 sigemptyset (&flush_mask);
fb0e1ba7 1001
3f07c44b
MK
1002 /* Make sure SIGCHLD is blocked. */
1003 if (! sigismember (&blocked_mask, SIGCHLD))
1004 {
1005 sigaddset (&blocked_mask, SIGCHLD);
1006 sigprocmask (SIG_BLOCK, &blocked_mask, NULL);
1007 }
1008
fb0e1ba7
MK
1009 retry:
1010
9a973a8f
MK
1011 /* Make sure there is at least one LWP that has been resumed, at
1012 least if there are any LWPs at all. */
1013 gdb_assert (num_lwps == 0 || iterate_over_lwps (resumed_callback, NULL));
fce0e6e1 1014
fb0e1ba7
MK
1015 /* First check if there is a LWP with a wait status pending. */
1016 if (pid == -1)
1017 {
b1aeb4c5 1018 /* Any LWP that's been resumed will do. */
fb0e1ba7
MK
1019 lp = iterate_over_lwps (status_callback, NULL);
1020 if (lp)
1021 {
fb0e1ba7
MK
1022 status = lp->status;
1023 lp->status = 0;
b1aeb4c5
MS
1024
1025 if (debug_lin_lwp && status)
58eeadba
MK
1026 fprintf_unfiltered (gdb_stdlog,
1027 "Using pending wait status %s for LWP %ld.\n",
1028 status_to_str (status), GET_LWP (lp->ptid));
fb0e1ba7
MK
1029 }
1030
1031 /* But if we don't fine one, we'll have to wait, and check both
1032 cloned and uncloned processes. We start with the cloned
1033 processes. */
1034 options = __WCLONE | WNOHANG;
1035 }
39f77062 1036 else if (is_lwp (ptid))
fb0e1ba7 1037 {
7ca673cd 1038 if (debug_lin_lwp)
9085700c 1039 fprintf_unfiltered (gdb_stdlog,
b08cfdb6 1040 "Waiting for specific LWP %ld.\n",
ce696e05 1041 GET_LWP (ptid));
7ca673cd 1042
fb0e1ba7 1043 /* We have a specific LWP to check. */
39f77062 1044 lp = find_lwp_pid (ptid);
fb0e1ba7
MK
1045 gdb_assert (lp);
1046 status = lp->status;
1047 lp->status = 0;
7ca673cd 1048
b1aeb4c5 1049 if (debug_lin_lwp && status)
58eeadba
MK
1050 fprintf_unfiltered (gdb_stdlog,
1051 "Using pending wait status %s for LWP %ld.\n",
1052 status_to_str (status), GET_LWP (lp->ptid));
fb0e1ba7
MK
1053
1054 /* If we have to wait, take into account whether PID is a cloned
1055 process or not. And we have to convert it to something that
1056 the layer beneath us can understand. */
cacab7c4 1057 options = lp->cloned ? __WCLONE : 0;
39f77062 1058 pid = GET_LWP (ptid);
fb0e1ba7
MK
1059 }
1060
1061 if (status && lp->signalled)
1062 {
1063 /* A pending SIGSTOP may interfere with the normal stream of
1064 events. In a typical case where interference is a problem,
1065 we have a SIGSTOP signal pending for LWP A while
1066 single-stepping it, encounter an event in LWP B, and take the
1067 pending SIGSTOP while trying to stop LWP A. After processing
1068 the event in LWP B, LWP A is continued, and we'll never see
1069 the SIGTRAP associated with the last time we were
1070 single-stepping LWP A. */
1071
1072 /* Resume the thread. It should halt immediately returning the
1073 pending SIGSTOP. */
39f77062
KB
1074 child_resume (pid_to_ptid (GET_LWP (lp->ptid)), lp->step,
1075 TARGET_SIGNAL_0);
fb0e1ba7 1076 lp->stopped = 0;
fce0e6e1 1077 gdb_assert (lp->resumed);
fb0e1ba7
MK
1078
1079 /* This should catch the pending SIGSTOP. */
1080 stop_wait_callback (lp, NULL);
1081 }
1082
1083 set_sigint_trap (); /* Causes SIGINT to be passed on to the
1084 attached process. */
1085 set_sigio_trap ();
1086
1087 while (status == 0)
1088 {
1089 pid_t lwpid;
1090
1091 lwpid = waitpid (pid, &status, options);
1092 if (lwpid > 0)
1093 {
1094 gdb_assert (pid == -1 || lwpid == pid);
1095
39f77062 1096 lp = find_lwp_pid (pid_to_ptid (lwpid));
fb0e1ba7
MK
1097 if (! lp)
1098 {
39f77062 1099 lp = add_lwp (BUILD_LWP (lwpid, GET_PID (inferior_ptid)));
cacab7c4
MK
1100 if (options & __WCLONE)
1101 lp->cloned = 1;
1102
fb0e1ba7
MK
1103 if (threaded)
1104 {
3f07c44b
MK
1105 gdb_assert (WIFSTOPPED (status)
1106 && WSTOPSIG (status) == SIGSTOP);
fb0e1ba7
MK
1107 lp->signalled = 1;
1108
39f77062 1109 if (! in_thread_list (inferior_ptid))
fb0e1ba7 1110 {
39f77062
KB
1111 inferior_ptid = BUILD_LWP (GET_PID (inferior_ptid),
1112 GET_PID (inferior_ptid));
1113 add_thread (inferior_ptid);
fb0e1ba7
MK
1114 }
1115
39f77062 1116 add_thread (lp->ptid);
fb0e1ba7 1117 printf_unfiltered ("[New %s]\n",
39f77062 1118 target_pid_to_str (lp->ptid));
fb0e1ba7
MK
1119 }
1120 }
1121
1122 /* Make sure we don't report a TARGET_WAITKIND_EXITED or
1123 TARGET_WAITKIND_SIGNALLED event if there are still LWP's
1124 left in the process. */
1125 if ((WIFEXITED (status) || WIFSIGNALED (status)) && num_lwps > 1)
1126 {
39f77062 1127 if (in_thread_list (lp->ptid))
fb0e1ba7 1128 {
e6328671 1129 /* Core GDB cannot deal with us deleting the current
fb0e1ba7 1130 thread. */
39f77062
KB
1131 if (! ptid_equal (lp->ptid, inferior_ptid))
1132 delete_thread (lp->ptid);
fb0e1ba7 1133 printf_unfiltered ("[%s exited]\n",
39f77062 1134 target_pid_to_str (lp->ptid));
fb0e1ba7 1135 }
7ca673cd 1136 if (debug_lin_lwp)
9085700c
MS
1137 fprintf_unfiltered (gdb_stdlog,
1138 "%s exited.\n",
39f77062 1139 target_pid_to_str (lp->ptid));
7ca673cd 1140
39f77062 1141 delete_lwp (lp->ptid);
fb0e1ba7
MK
1142
1143 /* Make sure there is at least one thread running. */
1144 gdb_assert (iterate_over_lwps (running_callback, NULL));
1145
1146 /* Discard the event. */
1147 status = 0;
1148 continue;
1149 }
1150
1151 /* Make sure we don't report a SIGSTOP that we sent
1152 ourselves in an attempt to stop an LWP. */
1153 if (lp->signalled && WIFSTOPPED (status)
1154 && WSTOPSIG (status) == SIGSTOP)
1155 {
7ca673cd 1156 if (debug_lin_lwp)
9085700c
MS
1157 fprintf_unfiltered (gdb_stdlog,
1158 "Delayed SIGSTOP caught for %s.\n",
39f77062 1159 target_pid_to_str (lp->ptid));
7ca673cd 1160
fb0e1ba7
MK
1161 /* This is a delayed SIGSTOP. */
1162 lp->signalled = 0;
1163
39f77062
KB
1164 child_resume (pid_to_ptid (GET_LWP (lp->ptid)), lp->step,
1165 TARGET_SIGNAL_0);
fb0e1ba7 1166 lp->stopped = 0;
fce0e6e1 1167 gdb_assert (lp->resumed);
fb0e1ba7
MK
1168
1169 /* Discard the event. */
1170 status = 0;
1171 continue;
1172 }
1173
1174 break;
1175 }
1176
1177 if (pid == -1)
1178 {
1179 /* Alternate between checking cloned and uncloned processes. */
1180 options ^= __WCLONE;
1181
1182 /* And suspend every time we have checked both. */
1183 if (options & __WCLONE)
1184 sigsuspend (&suspend_mask);
1185 }
1186
1187 /* We shouldn't end up here unless we want to try again. */
1188 gdb_assert (status == 0);
1189 }
1190
1191 clear_sigio_trap ();
1192 clear_sigint_trap ();
1193
1194 gdb_assert (lp);
1195
1196 /* Don't report signals that GDB isn't interested in, such as
1197 signals that are neither printed nor stopped upon. Stopping all
1198 threads can be a bit time-consuming so if we want decent
1199 performance with heavily multi-threaded programs, especially when
1200 they're using a high frequency timer, we'd better avoid it if we
1201 can. */
1202
1203 if (WIFSTOPPED (status))
1204 {
1205 int signo = target_signal_from_host (WSTOPSIG (status));
1206
1207 if (signal_stop_state (signo) == 0
1208 && signal_print_state (signo) == 0
1209 && signal_pass_state (signo) == 1)
1210 {
fce0e6e1
MK
1211 /* FIMXE: kettenis/2001-06-06: Should we resume all threads
1212 here? It is not clear we should. GDB may not expect
1213 other threads to run. On the other hand, not resuming
1214 newly attached threads may cause an unwanted delay in
1215 getting them running. */
c4365b19 1216 child_resume (pid_to_ptid (GET_LWP (lp->ptid)), lp->step, signo);
fce0e6e1 1217 lp->stopped = 0;
fb0e1ba7
MK
1218 status = 0;
1219 goto retry;
1220 }
de4ca854
MK
1221
1222 if (signo == TARGET_SIGNAL_INT
1223 && signal_pass_state (signo) == 0)
1224 {
1225 /* If ^C/BREAK is typed at the tty/console, SIGINT gets
1226 forwarded to the entire process group, that is, all LWP's
1227 will receive it. Since we only want to report it once,
1228 we try to flush it from all LWPs except this one. */
1229 sigaddset (&flush_mask, SIGINT);
1230 }
fb0e1ba7
MK
1231 }
1232
1233 /* This LWP is stopped now. */
1234 lp->stopped = 1;
1235
b1aeb4c5 1236 if (debug_lin_lwp)
58eeadba
MK
1237 fprintf_unfiltered (gdb_stdlog, "Candidate event %s in LWP %ld.\n",
1238 status_to_str (status), GET_LWP (lp->ptid));
b1aeb4c5 1239
fb0e1ba7
MK
1240 /* Now stop all other LWP's ... */
1241 iterate_over_lwps (stop_callback, NULL);
1242
1243 /* ... and wait until all of them have reported back that they're no
1244 longer running. */
de4ca854 1245 iterate_over_lwps (stop_wait_callback, &flush_mask);
fb0e1ba7 1246
00d4fce6
MK
1247 /* If we're not waiting for a specific LWP, choose an event LWP from
1248 among those that have had events. Giving equal priority to all
1249 LWPs that have had events helps prevent starvation. */
1250 if (pid == -1)
1251 select_event_lwp (&lp, &status);
b1aeb4c5 1252
00d4fce6
MK
1253 /* Now that we've selected our final event LWP, cancel any
1254 breakpoints in other LWPs that have hit a GDB breakpoint. See
1255 the comment in cancel_breakpoints_callback to find out why. */
1256 iterate_over_lwps (cancel_breakpoints_callback, lp);
b1aeb4c5 1257
fb0e1ba7
MK
1258 /* If we're not running in "threaded" mode, we'll report the bare
1259 process id. */
1260
1261 if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP)
b1aeb4c5
MS
1262 {
1263 trap_ptid = (threaded ? lp->ptid : pid_to_ptid (GET_LWP (lp->ptid)));
1264 if (debug_lin_lwp)
1265 fprintf_unfiltered (gdb_stdlog,
1266 "LLW: trap_ptid is %ld\n",
1267 GET_LWP (trap_ptid));
1268 }
fb0e1ba7 1269 else
39f77062 1270 trap_ptid = null_ptid;
fb0e1ba7
MK
1271
1272 store_waitstatus (ourstatus, status);
39f77062 1273 return (threaded ? lp->ptid : pid_to_ptid (GET_LWP (lp->ptid)));
fb0e1ba7
MK
1274}
1275
1276static int
1277kill_callback (struct lwp_info *lp, void *data)
1278{
39f77062 1279 ptrace (PTRACE_KILL, GET_LWP (lp->ptid), 0, 0);
fb0e1ba7
MK
1280 return 0;
1281}
1282
1283static int
1284kill_wait_callback (struct lwp_info *lp, void *data)
1285{
1286 pid_t pid;
1287
1288 /* We must make sure that there are no pending events (delayed
1289 SIGSTOPs, pending SIGTRAPs, etc.) to make sure the current
1290 program doesn't interfere with any following debugging session. */
1291
1292 /* For cloned processes we must check both with __WCLONE and
1293 without, since the exit status of a cloned process isn't reported
1294 with __WCLONE. */
cacab7c4 1295 if (lp->cloned)
fb0e1ba7
MK
1296 {
1297 do
1298 {
39f77062 1299 pid = waitpid (GET_LWP (lp->ptid), NULL, __WCLONE);
fb0e1ba7 1300 }
39f77062 1301 while (pid == GET_LWP (lp->ptid));
fb0e1ba7
MK
1302
1303 gdb_assert (pid == -1 && errno == ECHILD);
1304 }
1305
1306 do
1307 {
39f77062 1308 pid = waitpid (GET_LWP (lp->ptid), NULL, 0);
fb0e1ba7 1309 }
39f77062 1310 while (pid == GET_LWP (lp->ptid));
fb0e1ba7
MK
1311
1312 gdb_assert (pid == -1 && errno == ECHILD);
1313 return 0;
1314}
1315
1316static void
1317lin_lwp_kill (void)
1318{
1319 /* Kill all LWP's ... */
1320 iterate_over_lwps (kill_callback, NULL);
1321
1322 /* ... and wait until we've flushed all events. */
1323 iterate_over_lwps (kill_wait_callback, NULL);
1324
1325 target_mourn_inferior ();
1326}
1327
1328static void
1329lin_lwp_create_inferior (char *exec_file, char *allargs, char **env)
1330{
c194fbe1 1331 child_ops.to_create_inferior (exec_file, allargs, env);
fb0e1ba7
MK
1332}
1333
1334static void
1335lin_lwp_mourn_inferior (void)
1336{
c194fbe1 1337 trap_ptid = null_ptid;
fb0e1ba7 1338
c194fbe1 1339 /* Destroy LWP info; it's no longer valid. */
fb0e1ba7
MK
1340 init_lwp_list ();
1341
4c8de859 1342 /* Restore the original signal mask. */
3f07c44b
MK
1343 sigprocmask (SIG_SETMASK, &normal_mask, NULL);
1344 sigemptyset (&blocked_mask);
1345
c194fbe1 1346 child_ops.to_mourn_inferior ();
fb0e1ba7
MK
1347}
1348
1349static void
1350lin_lwp_fetch_registers (int regno)
1351{
39f77062 1352 struct cleanup *old_chain = save_inferior_ptid ();
fb0e1ba7 1353
39f77062
KB
1354 if (is_lwp (inferior_ptid))
1355 inferior_ptid = pid_to_ptid (GET_LWP (inferior_ptid));
fb0e1ba7
MK
1356
1357 fetch_inferior_registers (regno);
1358
1359 do_cleanups (old_chain);
1360}
1361
1362static void
1363lin_lwp_store_registers (int regno)
1364{
39f77062 1365 struct cleanup *old_chain = save_inferior_ptid ();
fb0e1ba7 1366
39f77062
KB
1367 if (is_lwp (inferior_ptid))
1368 inferior_ptid = pid_to_ptid (GET_LWP (inferior_ptid));
fb0e1ba7
MK
1369
1370 store_inferior_registers (regno);
1371
1372 do_cleanups (old_chain);
1373}
1374
1375static int
1376lin_lwp_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
e5da8f38 1377 struct mem_attrib *attrib,
fb0e1ba7
MK
1378 struct target_ops *target)
1379{
39f77062 1380 struct cleanup *old_chain = save_inferior_ptid ();
fb0e1ba7
MK
1381 int xfer;
1382
39f77062
KB
1383 if (is_lwp (inferior_ptid))
1384 inferior_ptid = pid_to_ptid (GET_LWP (inferior_ptid));
fb0e1ba7 1385
e5da8f38 1386 xfer = child_xfer_memory (memaddr, myaddr, len, write, attrib, target);
fb0e1ba7
MK
1387
1388 do_cleanups (old_chain);
1389 return xfer;
1390}
1391
1392static int
39f77062 1393lin_lwp_thread_alive (ptid_t ptid)
fb0e1ba7 1394{
39f77062 1395 gdb_assert (is_lwp (ptid));
fb0e1ba7
MK
1396
1397 errno = 0;
39f77062 1398 ptrace (PTRACE_PEEKUSER, GET_LWP (ptid), 0, 0);
fb0e1ba7
MK
1399 if (errno)
1400 return 0;
1401
1402 return 1;
1403}
1404
1405static char *
39f77062 1406lin_lwp_pid_to_str (ptid_t ptid)
fb0e1ba7
MK
1407{
1408 static char buf[64];
1409
39f77062 1410 if (is_lwp (ptid))
fb0e1ba7 1411 {
b08cfdb6 1412 snprintf (buf, sizeof (buf), "LWP %ld", GET_LWP (ptid));
fb0e1ba7
MK
1413 return buf;
1414 }
1415
39f77062 1416 return normal_pid_to_str (ptid);
fb0e1ba7
MK
1417}
1418
1419static void
1420init_lin_lwp_ops (void)
1421{
1422#if 0
1423 lin_lwp_ops.to_open = lin_lwp_open;
1424#endif
1425 lin_lwp_ops.to_shortname = "lwp-layer";
1426 lin_lwp_ops.to_longname = "lwp-layer";
1427 lin_lwp_ops.to_doc = "Low level threads support (LWP layer)";
1428 lin_lwp_ops.to_attach = lin_lwp_attach;
1429 lin_lwp_ops.to_detach = lin_lwp_detach;
1430 lin_lwp_ops.to_resume = lin_lwp_resume;
1431 lin_lwp_ops.to_wait = lin_lwp_wait;
1432 lin_lwp_ops.to_fetch_registers = lin_lwp_fetch_registers;
1433 lin_lwp_ops.to_store_registers = lin_lwp_store_registers;
1434 lin_lwp_ops.to_xfer_memory = lin_lwp_xfer_memory;
1435 lin_lwp_ops.to_kill = lin_lwp_kill;
1436 lin_lwp_ops.to_create_inferior = lin_lwp_create_inferior;
1437 lin_lwp_ops.to_mourn_inferior = lin_lwp_mourn_inferior;
1438 lin_lwp_ops.to_thread_alive = lin_lwp_thread_alive;
1439 lin_lwp_ops.to_pid_to_str = lin_lwp_pid_to_str;
1440 lin_lwp_ops.to_stratum = thread_stratum;
1441 lin_lwp_ops.to_has_thread_control = tc_schedlock;
1442 lin_lwp_ops.to_magic = OPS_MAGIC;
1443}
1444
1445static void
1446sigchld_handler (int signo)
1447{
1448 /* Do nothing. The only reason for this handler is that it allows
1449 us to use sigsuspend in lin_lwp_wait above to wait for the
1450 arrival of a SIGCHLD. */
1451}
1452
1453void
1454_initialize_lin_lwp (void)
1455{
1456 struct sigaction action;
fb0e1ba7
MK
1457
1458 extern void thread_db_init (struct target_ops *);
1459
1460 init_lin_lwp_ops ();
1461 add_target (&lin_lwp_ops);
1462 thread_db_init (&lin_lwp_ops);
1463
4c8de859 1464 /* Save the original signal mask. */
3f07c44b
MK
1465 sigprocmask (SIG_SETMASK, NULL, &normal_mask);
1466
fb0e1ba7
MK
1467 action.sa_handler = sigchld_handler;
1468 sigemptyset (&action.sa_mask);
1469 action.sa_flags = 0;
1470 sigaction (SIGCHLD, &action, NULL);
1471
3f07c44b
MK
1472 /* Make sure we don't block SIGCHLD during a sigsuspend. */
1473 sigprocmask (SIG_SETMASK, NULL, &suspend_mask);
fb0e1ba7 1474 sigdelset (&suspend_mask, SIGCHLD);
3f07c44b
MK
1475
1476 sigemptyset (&blocked_mask);
7ca673cd
MS
1477
1478 add_show_from_set (add_set_cmd ("lin-lwp", no_class, var_zinteger,
1479 (char *) &debug_lin_lwp,
8605d56e 1480 "Set debugging of GNU/Linux lwp module.\n\
7ca673cd
MS
1481Enables printf debugging output.\n",
1482 &setdebuglist),
1483 &showdebuglist);
fb0e1ba7
MK
1484}
1485\f
1486
1487/* FIXME: kettenis/2000-08-26: The stuff on this page is specific to
8605d56e
AC
1488 the GNU/Linux Threads library and therefore doesn't really belong
1489 here. */
fb0e1ba7
MK
1490
1491/* Read variable NAME in the target and return its value if found.
1492 Otherwise return zero. It is assumed that the type of the variable
1493 is `int'. */
1494
1495static int
1496get_signo (const char *name)
1497{
1498 struct minimal_symbol *ms;
1499 int signo;
1500
1501 ms = lookup_minimal_symbol (name, NULL, NULL);
1502 if (ms == NULL)
1503 return 0;
1504
1505 if (target_read_memory (SYMBOL_VALUE_ADDRESS (ms), (char *) &signo,
1506 sizeof (signo)) != 0)
1507 return 0;
1508
1509 return signo;
1510}
1511
1512/* Return the set of signals used by the threads library in *SET. */
1513
1514void
1515lin_thread_get_thread_signals (sigset_t *set)
1516{
3f07c44b
MK
1517 struct sigaction action;
1518 int restart, cancel;
fb0e1ba7
MK
1519
1520 sigemptyset (set);
1521
1522 restart = get_signo ("__pthread_sig_restart");
1523 if (restart == 0)
1524 return;
1525
1526 cancel = get_signo ("__pthread_sig_cancel");
1527 if (cancel == 0)
1528 return;
1529
1530 sigaddset (set, restart);
1531 sigaddset (set, cancel);
3f07c44b 1532
8605d56e
AC
1533 /* The GNU/Linux Threads library makes terminating threads send a
1534 special "cancel" signal instead of SIGCHLD. Make sure we catch
1535 those (to prevent them from terminating GDB itself, which is
1536 likely to be their default action) and treat them the same way as
1537 SIGCHLD. */
3f07c44b
MK
1538
1539 action.sa_handler = sigchld_handler;
1540 sigemptyset (&action.sa_mask);
1541 action.sa_flags = 0;
1542 sigaction (cancel, &action, NULL);
1543
1544 /* We block the "cancel" signal throughout this code ... */
1545 sigaddset (&blocked_mask, cancel);
1546 sigprocmask (SIG_BLOCK, &blocked_mask, NULL);
1547
1548 /* ... except during a sigsuspend. */
1549 sigdelset (&suspend_mask, cancel);
fb0e1ba7 1550}
This page took 0.23455 seconds and 4 git commands to generate.