Redefine ptid_t to be a struct rather than an int.
[external/binutils.git] / gdb / lin-thread.c
1 /* Multi-threaded debugging support for the thread_db interface,
2    used on operating systems such as Solaris and Linux.
3    Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330,
20    Boston, MA 02111-1307, USA.  */
21
22 /* This module implements a thread_stratum target that sits on top of
23    a normal process_stratum target (such as procfs or ptrace).  The
24    process_stratum target must install this thread_stratum target when
25    it detects the presence of the thread_db shared library.
26
27    This module will then use the thread_db API to add thread-awareness
28    to the functionality provided by the process_stratum target (or in
29    some cases, to add user-level thread awareness on top of the 
30    kernel-level thread awareness that is already provided by the 
31    process_stratum target).
32
33    Solaris threads (for instance) are a multi-level thread implementation;
34    the kernel provides a Light Weight Process (LWP) which the procfs 
35    process_stratum module is aware of.  This module must then mediate
36    the relationship between kernel LWP threads and user (eg. posix)
37    threads.
38
39    Linux threads are likely to be different -- but the thread_db 
40    library API should make the difference largely transparent to GDB.
41
42    */
43
44 /* The thread_db API provides a number of functions that give the caller
45    access to the inner workings of the child process's thread library. 
46    We will be using the following (others may be added):
47
48    td_thr_validate              Confirm valid "live" thread
49    td_thr_get_info              Get info about a thread
50    td_thr_getgregs              Get thread's general registers
51    td_thr_getfpregs             Get thread's floating point registers
52    td_thr_setgregs              Set thread's general registers
53    td_thr_setfpregs             Set thread's floating point registers
54    td_ta_map_id2thr             Get thread handle from thread id
55    td_ta_map_lwp2thr            Get thread handle from LWP id
56    td_ta_thr_iter               Iterate over all threads (with callback)
57
58    In return, the debugger has to provide certain services to the 
59    thread_db library.  Some of these aren't actually required to do
60    anything in practice.  For instance, the thread_db expects to be
61    able to stop the child process and start it again: but in our
62    context, the child process will always be stopped already when we
63    invoke the thread_db library, so the functions that we provide for
64    the library to stop and start the child process are no-ops.
65
66    Here is the list of functions which we export to the thread_db
67    library, divided into no-op functions vs. functions that actually
68    have to do something:
69
70    No-op functions:
71
72    ps_pstop                     Stop the child process
73    ps_pcontinue                 Continue the child process
74    ps_lstop                     Stop a specific LWP (kernel thread)
75    ps_lcontinue                 Continue an LWP
76    ps_lgetxregsize              Get size of LWP's xregs (sparc)
77    ps_lgetxregs                 Get LWP's xregs (sparc)
78    ps_lsetxregs                 Set LWP's xregs (sparc)
79
80    Functions that have to do useful work:
81
82    ps_pglobal_lookup            Get the address of a global symbol
83    ps_pdread                    Read memory, data segment
84    ps_ptread                    Read memory, text segment
85    ps_pdwrite                   Write memory, data segment
86    ps_ptwrite                   Write memory, text segment
87    ps_lgetregs                  Get LWP's general registers
88    ps_lgetfpregs                Get LWP's floating point registers
89    ps_lsetregs                  Set LWP's general registers
90    ps_lsetfpregs                Set LWP's floating point registers
91    ps_lgetLDT                   Get LWP's Local Descriptor Table (x86)
92    
93    Thus, if we ask the thread_db library to give us the general registers
94    for user thread X, thread_db may figure out that user thread X is 
95    actually mapped onto kernel thread Y.  Thread_db does not know how
96    to obtain the registers for kernel thread Y, but GDB does, so thread_db
97    turns the request right back to us via the ps_lgetregs callback.  */
98
99 #include "defs.h"
100 #include "gdbthread.h"
101 #include "target.h"
102 #include "inferior.h"
103 #include "gdbcmd.h"
104 #include "regcache.h"
105
106 #include "gdb_wait.h"
107
108 #include <time.h>
109
110 #if defined(USE_PROC_FS) || defined(HAVE_GREGSET_T)
111 #include <sys/procfs.h>
112 #endif
113
114 #include "gdb_proc_service.h"
115
116 #if defined HAVE_STDINT_H       /* Pre-5.2 systems don't have this header */
117 #if defined (HAVE_THREAD_DB_H)
118 #include <thread_db.h>          /* defines outgoing API (td_thr_* calls) */
119 #else
120 #include "gdb_thread_db.h"
121 #endif
122
123 #include <dlfcn.h>              /* dynamic library interface */
124
125 /* Prototypes for supply_gregset etc. */
126 #include "gregset.h"
127
128 /* Macros for superimposing PID and TID into inferior_ptid.  */
129 #define GET_PID(ptid)           ptid_get_pid (ptid)
130 #define GET_LWP(ptid)           ptid_get_lwp (ptid)
131 #define GET_THREAD(ptid)        ptid_get_tid (ptid)
132
133 #define is_lwp(ptid)            (GET_LWP (ptid) != 0)
134 #define is_thread(ptid)         (GET_THREAD (ptid) != 0)
135
136 #define BUILD_LWP(lwp, pid)     ptid_build (pid, lwp, 0)
137 #define BUILD_THREAD(tid, pid)  ptid_build (pid, 0, tid)
138
139 /* From linux-thread.c.  FIXME: These should go in a separate header
140    file, but I'm told that the life expectancy of lin-thread.c and
141    linux-thread.c isn't very long... */
142
143 extern int linux_child_wait (int, int *, int *);
144 extern void check_all_signal_numbers (void);
145 extern void linuxthreads_discard_global_state (void);
146 extern void attach_thread (int);
147
148 /*
149  * target_beneath is a pointer to the target_ops underlying this one.
150  */
151
152 static struct target_ops *target_beneath;
153
154
155 /*
156  * target vector defined in this module:
157  */
158
159 static struct target_ops thread_db_ops;
160
161 /*
162  * Typedefs required to resolve differences between the thread_db
163  * and proc_service API defined on different versions of Solaris:
164  */
165
166 #if defined(PROC_SERVICE_IS_OLD)
167 typedef const struct ps_prochandle *gdb_ps_prochandle_t;
168 typedef char *gdb_ps_read_buf_t;
169 typedef char *gdb_ps_write_buf_t;
170 typedef int gdb_ps_size_t;
171 #else
172 typedef struct ps_prochandle *gdb_ps_prochandle_t;
173 typedef void *gdb_ps_read_buf_t;
174 typedef const void *gdb_ps_write_buf_t;
175 typedef size_t gdb_ps_size_t;
176 #endif
177
178 /* 
179  * proc_service callback functions, called by thread_db.
180  */
181
182 ps_err_e
183 ps_pstop (gdb_ps_prochandle_t ph)               /* Process stop */
184 {
185   return PS_OK;
186 }
187
188 ps_err_e
189 ps_pcontinue (gdb_ps_prochandle_t ph)           /* Process continue */
190 {
191   return PS_OK;
192 }
193
194 ps_err_e
195 ps_lstop (gdb_ps_prochandle_t ph,               /* LWP stop */
196           lwpid_t lwpid)
197 {
198   return PS_OK;
199 }
200
201 ps_err_e
202 ps_lcontinue (gdb_ps_prochandle_t ph,           /* LWP continue */
203               lwpid_t lwpid)
204 {
205   return PS_OK;
206 }
207
208 ps_err_e
209 ps_lgetxregsize (gdb_ps_prochandle_t ph,        /* Get XREG size */
210                  lwpid_t lwpid,
211                  int *xregsize)
212 {
213   return PS_OK;
214 }
215
216 ps_err_e
217 ps_lgetxregs (gdb_ps_prochandle_t ph,           /* Get XREGS */
218               lwpid_t lwpid,
219               caddr_t xregset)
220 {
221   return PS_OK;
222 }
223
224 ps_err_e
225 ps_lsetxregs (gdb_ps_prochandle_t ph,           /* Set XREGS */
226               lwpid_t lwpid,
227               caddr_t xregset)
228 {
229   return PS_OK;
230 }
231
232 void
233 ps_plog (const char *fmt, ...)
234 {
235   va_list args;
236
237   va_start (args, fmt);
238   vfprintf_filtered (gdb_stderr, fmt, args);
239 }
240
241 /* Look up a symbol in GDB's global symbol table.
242    Return the symbol's address.
243    FIXME: it would be more correct to look up the symbol in the context 
244    of the LD_OBJECT_NAME provided.  However we're probably fairly safe 
245    as long as there aren't name conflicts with other libraries.  */
246
247 ps_err_e
248 ps_pglobal_lookup (gdb_ps_prochandle_t ph,
249                    const char *ld_object_name,  /* the library name */
250                    const char *ld_symbol_name,  /* the symbol name */
251                    paddr_t    *ld_symbol_addr)  /* return the symbol addr */
252 {
253   struct minimal_symbol *ms;
254
255   ms = lookup_minimal_symbol (ld_symbol_name, NULL, NULL);
256
257   if (!ms)
258     return PS_NOSYM;
259
260   *ld_symbol_addr = SYMBOL_VALUE_ADDRESS (ms);
261
262   return PS_OK;
263 }
264
265 /* Worker function for all memory reads and writes: */
266 static ps_err_e rw_common (const struct ps_prochandle *ph, 
267                            paddr_t addr,
268                            char *buf, 
269                            int size, 
270                            int write_p);
271
272 /* target_xfer_memory direction consts */
273 enum {PS_READ = 0, PS_WRITE = 1};
274
275 ps_err_e
276 ps_pdread (gdb_ps_prochandle_t ph,      /* read from data segment */
277            paddr_t             addr,
278            gdb_ps_read_buf_t   buf,
279            gdb_ps_size_t       size)
280 {
281   return rw_common (ph, addr, buf, size, PS_READ);
282 }
283
284 ps_err_e
285 ps_pdwrite (gdb_ps_prochandle_t ph,     /* write to data segment */
286             paddr_t             addr,
287             gdb_ps_write_buf_t  buf,
288             gdb_ps_size_t       size)
289 {
290   return rw_common (ph, addr, (char *) buf, size, PS_WRITE);
291 }
292
293 ps_err_e
294 ps_ptread (gdb_ps_prochandle_t ph,      /* read from text segment */
295            paddr_t             addr,
296            gdb_ps_read_buf_t   buf,
297            gdb_ps_size_t       size)
298 {
299   return rw_common (ph, addr, buf, size, PS_READ);
300 }
301
302 ps_err_e
303 ps_ptwrite (gdb_ps_prochandle_t ph,     /* write to text segment */
304             paddr_t             addr,
305             gdb_ps_write_buf_t  buf,
306             gdb_ps_size_t       size)
307 {
308   return rw_common (ph, addr, (char *) buf, size, PS_WRITE);
309 }
310
311 static char *thr_err_string   (td_err_e);
312 static char *thr_state_string (td_thr_state_e);
313
314 struct ps_prochandle main_prochandle;
315 td_thragent_t *      main_threadagent;
316
317 /* 
318  * Common proc_service routine for reading and writing memory.  
319  */
320
321 /* FIXME: once we've munged the inferior_ptid, why can't we
322    simply call target_read/write_memory and return?  */
323
324 static ps_err_e
325 rw_common (const struct ps_prochandle *ph,
326            paddr_t addr,
327            char   *buf,
328            int     size,
329            int     write_p)
330 {
331   struct cleanup *old_chain = save_inferior_ptid ();
332   int to_do = size;
333   int done  = 0;
334
335   inferior_ptid = pid_to_ptid (main_prochandle.pid);
336
337   while (to_do > 0)
338     {
339       done = current_target.to_xfer_memory (addr, buf, size, write_p, 
340                                             &current_target);
341       if (done <= 0)
342         {
343           if (write_p == PS_READ)
344             print_sys_errmsg ("rw_common (): read", errno);
345           else
346             print_sys_errmsg ("rw_common (): write", errno);
347
348           return PS_ERR;
349         }
350       to_do -= done;
351       buf   += done;
352     }
353   do_cleanups (old_chain);
354   return PS_OK;
355 }
356
357 /* Cleanup functions used by the register callbacks
358    (which have to manipulate the global inferior_ptid).  */
359
360 ps_err_e
361 ps_lgetregs (gdb_ps_prochandle_t ph,            /* Get LWP general regs */
362              lwpid_t     lwpid,
363              prgregset_t gregset)
364 {
365   struct cleanup *old_chain = save_inferior_ptid ();
366
367   inferior_ptid = BUILD_LWP (lwpid, main_prochandle.pid);
368   current_target.to_fetch_registers (-1);
369
370   fill_gregset ((gdb_gregset_t *) gregset, -1);
371   do_cleanups (old_chain);
372
373   return PS_OK;
374 }
375
376 ps_err_e
377 ps_lsetregs (gdb_ps_prochandle_t ph,            /* Set LWP general regs */
378              lwpid_t           lwpid,
379              const prgregset_t gregset)
380 {
381   struct cleanup *old_chain = save_inferior_ptid ();
382
383   inferior_ptid = BUILD_LWP (lwpid, main_prochandle.pid);
384   supply_gregset ((gdb_gregset_t *) gregset);
385   current_target.to_store_registers (-1);
386   do_cleanups (old_chain);
387   return PS_OK;
388 }
389
390 ps_err_e
391 ps_lgetfpregs (gdb_ps_prochandle_t ph,          /* Get LWP float regs */
392                lwpid_t       lwpid,
393                gdb_prfpregset_t *fpregset)
394 {
395   struct cleanup *old_chain = save_inferior_ptid ();
396
397   inferior_ptid = BUILD_LWP (lwpid, main_prochandle.pid);
398   current_target.to_fetch_registers (-1);
399   fill_fpregset (fpregset, -1);
400   do_cleanups (old_chain);
401   return PS_OK;
402 }
403
404 ps_err_e
405 ps_lsetfpregs (gdb_ps_prochandle_t ph,          /* Set LWP float regs */
406                lwpid_t             lwpid,
407                const gdb_prfpregset_t *fpregset)
408 {
409   struct cleanup *old_chain = save_inferior_ptid ();
410
411   inferior_ptid = BUILD_LWP (lwpid, main_prochandle.pid);
412   supply_fpregset (fpregset);
413   current_target.to_store_registers (-1);
414   do_cleanups (old_chain);
415   return PS_OK;
416 }
417
418 /*
419  * ps_getpid
420  *
421  * return the main pid for the child process
422  * (special for Linux -- not used on Solaris)
423  */
424
425 pid_t
426 ps_getpid (gdb_ps_prochandle_t ph)
427 {
428   return ph->pid;
429 }
430
431 #ifdef TM_I386SOL2_H
432
433 /* Reads the local descriptor table of a LWP.  */
434
435 ps_err_e
436 ps_lgetLDT (gdb_ps_prochandle_t ph, lwpid_t lwpid,
437             struct ssd *pldt)
438 {
439   /* NOTE: only used on Solaris, therefore OK to refer to procfs.c */
440   extern struct ssd *procfs_find_LDT_entry (int);
441   struct ssd *ret;
442
443   ret = procfs_find_LDT_entry (BUILD_LWP (lwpid, 
444                                           PIDGET (main_prochandle.pid)));
445   if (ret)
446     {
447       memcpy (pldt, ret, sizeof (struct ssd));
448       return PS_OK;
449     }
450   else  /* LDT not found. */
451     return PS_ERR;
452 }
453 #endif /* TM_I386SOL2_H */
454
455 /*
456  * Pointers to thread_db functions:
457  *
458  * These are a dynamic library mechanism.
459  * The dlfcn.h interface will be used to initialize these 
460  * so that they point to the appropriate functions in the
461  * thread_db dynamic library.  This is done dynamically 
462  * so that GDB can still run on systems that lack thread_db.  
463  */
464
465 static td_err_e (*p_td_init)              (void);
466
467 static td_err_e (*p_td_ta_new)            (const struct ps_prochandle *ph_p, 
468                                            td_thragent_t **ta_pp);
469
470 static td_err_e (*p_td_ta_delete)         (td_thragent_t *ta_p);
471
472 static td_err_e (*p_td_ta_get_nthreads)   (const td_thragent_t *ta_p,
473                                            int *nthread_p);
474
475
476 static td_err_e (*p_td_ta_thr_iter)       (const td_thragent_t *ta_p,
477                                            td_thr_iter_f *cb,
478                                            void *cbdata_p,
479                                            td_thr_state_e state,
480                                            int ti_pri, 
481                                            sigset_t *ti_sigmask_p,
482                                            unsigned ti_user_flags);
483
484 static td_err_e (*p_td_ta_event_addr)     (const td_thragent_t *ta_p,
485                                            u_long event,
486                                            td_notify_t *notify_p);
487
488 static td_err_e (*p_td_ta_event_getmsg)   (const td_thragent_t *ta_p,
489                                            td_event_msg_t *msg);
490
491 static td_err_e (*p_td_ta_set_event)      (const td_thragent_t *ta_p,
492                                            td_thr_events_t *events);
493
494 static td_err_e (*p_td_thr_validate)      (const td_thrhandle_t *th_p);
495
496 static td_err_e (*p_td_thr_event_enable)  (const td_thrhandle_t *th_p,
497                                            int on_off);
498
499 static td_err_e (*p_td_thr_get_info)      (const td_thrhandle_t *th_p,
500                                            td_thrinfo_t *ti_p);
501
502 static td_err_e (*p_td_thr_getgregs)      (const td_thrhandle_t *th_p,
503                                            prgregset_t regset);
504
505 static td_err_e (*p_td_thr_setgregs)      (const td_thrhandle_t *th_p,
506                                            const prgregset_t regset);
507
508 static td_err_e (*p_td_thr_getfpregs)     (const td_thrhandle_t *th_p,
509                                            gdb_prfpregset_t *fpregset);
510
511 static td_err_e (*p_td_thr_setfpregs)     (const td_thrhandle_t *th_p,
512                                            const gdb_prfpregset_t *fpregset);
513
514 static td_err_e (*p_td_ta_map_id2thr)     (const td_thragent_t *ta_p,
515                                            thread_t tid,
516                                            td_thrhandle_t *th_p);
517
518 static td_err_e (*p_td_ta_map_lwp2thr)    (const td_thragent_t *ta_p,
519                                            lwpid_t lwpid,
520                                            td_thrhandle_t *th_p);
521
522 /*
523  * API and target vector initialization function: thread_db_initialize.
524  *
525  * NOTE: this function is deliberately NOT named with the GDB convention
526  * of module initializer function names that begin with "_initialize".
527  * This module is NOT intended to be auto-initialized at GDB startup.
528  * Rather, it will only be initialized when a multi-threaded child
529  * process is detected.
530  *
531  */
532
533 /* 
534  * Initializer for thread_db library interface.
535  * This function does the dynamic library stuff (dlopen, dlsym), 
536  * and then calls the thread_db library's one-time initializer 
537  * function (td_init).  If everything succeeds, this function
538  * returns true; otherwise it returns false, and this module
539  * cannot be used.
540  */
541
542 static int
543 init_thread_db_library (void)
544 {
545   void *dlhandle;
546   td_err_e ret;
547
548   /* Open a handle to the "thread_db" dynamic library.  */
549   if ((dlhandle = dlopen ("libthread_db.so.1", RTLD_NOW)) == NULL)
550     return 0;                   /* fail */
551
552   /* Initialize pointers to the dynamic library functions we will use.
553    * Note that we are not calling the functions here -- we are only
554    * establishing pointers to them.
555    */
556
557   /* td_init: initialize thread_db library. */
558   if ((p_td_init = dlsym (dlhandle, "td_init")) == NULL)
559     return 0;                   /* fail */
560   /* td_ta_new: register a target process with thread_db.  */
561   if ((p_td_ta_new = dlsym (dlhandle, "td_ta_new")) == NULL)
562     return 0;                   /* fail */
563   /* td_ta_delete: un-register a target process with thread_db.  */
564   if ((p_td_ta_delete = dlsym (dlhandle, "td_ta_delete")) == NULL)
565     return 0;                   /* fail */
566
567   /* td_ta_map_id2thr: get thread handle from thread id.  */
568   if ((p_td_ta_map_id2thr = dlsym (dlhandle, "td_ta_map_id2thr")) == NULL)
569     return 0;                   /* fail */
570   /* td_ta_map_lwp2thr: get thread handle from lwp id.  */
571   if ((p_td_ta_map_lwp2thr = dlsym (dlhandle, "td_ta_map_lwp2thr")) == NULL)
572     return 0;                   /* fail */
573   /* td_ta_get_nthreads: get number of threads in target process.  */
574   if ((p_td_ta_get_nthreads = dlsym (dlhandle, "td_ta_get_nthreads")) == NULL)
575     return 0;                   /* fail */
576   /* td_ta_thr_iter: iterate over all thread handles.  */
577   if ((p_td_ta_thr_iter = dlsym (dlhandle, "td_ta_thr_iter")) == NULL)
578     return 0;                   /* fail */
579
580   /* td_thr_validate: make sure a thread handle is real and alive.  */
581   if ((p_td_thr_validate = dlsym (dlhandle, "td_thr_validate")) == NULL)
582     return 0;                   /* fail */
583   /* td_thr_get_info: get a bunch of info about a thread.  */
584   if ((p_td_thr_get_info = dlsym (dlhandle, "td_thr_get_info")) == NULL)
585     return 0;                   /* fail */
586   /* td_thr_getgregs: get general registers for thread.  */
587   if ((p_td_thr_getgregs = dlsym (dlhandle, "td_thr_getgregs")) == NULL)
588     return 0;                   /* fail */
589   /* td_thr_setgregs: set general registers for thread.  */
590   if ((p_td_thr_setgregs = dlsym (dlhandle, "td_thr_setgregs")) == NULL)
591     return 0;                   /* fail */
592   /* td_thr_getfpregs: get floating point registers for thread.  */
593   if ((p_td_thr_getfpregs = dlsym (dlhandle, "td_thr_getfpregs")) == NULL)
594     return 0;                   /* fail */
595   /* td_thr_setfpregs: set floating point registers for thread.  */
596   if ((p_td_thr_setfpregs = dlsym (dlhandle, "td_thr_setfpregs")) == NULL)
597     return 0;                   /* fail */
598   
599   ret = p_td_init ();
600   if (ret != TD_OK)
601     {
602       warning ("init_thread_db: td_init: %s", thr_err_string (ret));
603       return 0;
604     }
605
606   /* Optional functions:
607      We can still debug even if the following functions are not found.  */
608
609   /* td_ta_event_addr: get the breakpoint address for specified event.  */
610   p_td_ta_event_addr = dlsym (dlhandle, "td_ta_event_addr");
611
612   /* td_ta_event_getmsg: get the next event message for the process.  */
613   p_td_ta_event_getmsg = dlsym (dlhandle, "td_ta_event_getmsg");
614
615   /* td_ta_set_event: request notification of an event.  */
616   p_td_ta_set_event = dlsym (dlhandle, "td_ta_set_event");
617
618   /* td_thr_event_enable: enable event reporting in a thread.  */
619   p_td_thr_event_enable = dlsym (dlhandle, "td_thr_event_enable");
620
621   return 1;                     /* success */
622 }
623
624 /*
625  * Local utility functions:
626  */
627
628 /*
629
630    LOCAL FUNCTION
631
632    thr_err_string - Convert a thread_db error code to a string
633
634    SYNOPSIS
635
636    char * thr_err_string (errcode)
637
638    DESCRIPTION
639
640    Return a string description of the thread_db errcode.  If errcode
641    is unknown, then return an <unknown> message.
642
643  */
644
645 static char *
646 thr_err_string (td_err_e errcode)
647 {
648   static char buf[50];
649
650   switch (errcode) {
651   case TD_OK:           return "generic 'call succeeded'";
652   case TD_ERR:          return "generic error";
653   case TD_NOTHR:        return "no thread to satisfy query";
654   case TD_NOSV:         return "no sync handle to satisfy query";
655   case TD_NOLWP:        return "no lwp to satisfy query";
656   case TD_BADPH:        return "invalid process handle";
657   case TD_BADTH:        return "invalid thread handle";
658   case TD_BADSH:        return "invalid synchronization handle";
659   case TD_BADTA:        return "invalid thread agent";
660   case TD_BADKEY:       return "invalid key";
661   case TD_NOMSG:        return "no event message for getmsg";
662   case TD_NOFPREGS:     return "FPU register set not available";
663   case TD_NOLIBTHREAD:  return "application not linked with libthread";
664   case TD_NOEVENT:      return "requested event is not supported";
665   case TD_NOCAPAB:      return "capability not available";
666   case TD_DBERR:        return "debugger service failed";
667   case TD_NOAPLIC:      return "operation not applicable to";
668   case TD_NOTSD:        return "no thread-specific data for this thread";
669   case TD_MALLOC:       return "malloc failed";
670   case TD_PARTIALREG:   return "only part of register set was written/read";
671   case TD_NOXREGS:      return "X register set not available for this thread";
672   default:
673     sprintf (buf, "unknown thread_db error '%d'", errcode);
674     return buf;
675   }
676 }
677
678 /*
679
680    LOCAL FUNCTION
681
682    thr_state_string - Convert a thread_db state code to a string
683
684    SYNOPSIS
685
686    char *thr_state_string (statecode)
687
688    DESCRIPTION
689
690    Return the thread_db state string associated with statecode.  
691    If statecode is unknown, then return an <unknown> message.
692
693  */
694
695 static char *
696 thr_state_string (td_thr_state_e statecode)
697 {
698   static char buf[50];
699
700   switch (statecode) {
701   case TD_THR_STOPPED:          return "stopped by debugger";
702   case TD_THR_RUN:              return "runnable";
703   case TD_THR_ACTIVE:           return "active";
704   case TD_THR_ZOMBIE:           return "zombie";
705   case TD_THR_SLEEP:            return "sleeping";
706   case TD_THR_STOPPED_ASLEEP:   return "stopped by debugger AND blocked";
707   default:
708     sprintf (buf, "unknown thread_db state %d", statecode);
709     return buf;
710   }
711 }
712
713 /*
714  * Local thread/event list.
715  * This data structure will be used to hold a list of threads and 
716  * pending/deliverable events.
717  */
718
719 typedef struct THREADINFO {
720   thread_t       tid;           /* thread ID */
721   pid_t          lid;           /* process/lwp ID */
722   td_thr_state_e state;         /* thread state (a la thread_db) */
723   td_thr_type_e  type;          /* thread type (a la thread_db) */
724   int            pending;       /* true if holding a pending event */
725   int            status;        /* wait status of any interesting event */
726 } threadinfo;
727
728 threadinfo * threadlist;
729 int threadlist_max = 0;         /* current size of table */
730 int threadlist_top = 0;         /* number of threads now in table */
731 #define THREADLIST_ALLOC 100    /* chunk size by which to expand table */
732
733 static threadinfo *
734 insert_thread (int tid, int lid, td_thr_state_e state, td_thr_type_e type)
735 {
736   if (threadlist_top >= threadlist_max)
737     {
738       threadlist_max += THREADLIST_ALLOC;
739       threadlist      = xrealloc (threadlist, 
740                                   threadlist_max * sizeof (threadinfo));
741       if (threadlist == NULL)
742         return NULL;
743     }
744   threadlist[threadlist_top].tid     = tid;
745   threadlist[threadlist_top].lid     = lid;
746   threadlist[threadlist_top].state   = state;
747   threadlist[threadlist_top].type    = type;
748   threadlist[threadlist_top].pending = 0;
749   threadlist[threadlist_top].status  = 0;
750
751   return &threadlist[threadlist_top++];
752 }
753
754 static void
755 empty_threadlist (void)
756 {
757   threadlist_top = 0;
758 }
759
760 static threadinfo *
761 next_pending_event (void)
762 {
763   int i;
764
765   for (i = 0; i < threadlist_top; i++)
766     if (threadlist[i].pending)
767       return &threadlist[i];
768
769   return NULL;
770 }
771
772 static void
773 threadlist_iter (int (*func) (), void *data, td_thr_state_e state,
774                  td_thr_type_e type)
775 {
776   int i;
777
778   for (i = 0; i < threadlist_top; i++)
779     if ((state == TD_THR_ANY_STATE || state == threadlist[i].state) &&
780         (type  == TD_THR_ANY_TYPE  || type  == threadlist[i].type))
781       if ((*func) (&threadlist[i], data) != 0)
782         break;
783
784   return;
785 }     
786
787 /*
788  * Global state
789  * 
790  * Here we keep state information all collected in one place.
791  */
792
793 /* This flag is set when we activate, so that we don't do it twice. 
794    Defined in linux-thread.c and used for inter-target syncronization.  */
795 extern int using_thread_db;
796
797 /* The process id for which we've stopped.
798  * This is only set when we actually stop all threads.
799  * Otherwise it's zero.
800  */
801 static int event_pid;
802
803 /*
804  * The process id for a new thread to which we've just attached.
805  * This process needs special handling at resume time.
806  */
807 static int attach_pid;
808
809
810 /*
811  * thread_db event handling:
812  *
813  * The mechanism for event notification via the thread_db API.
814  * These events are implemented as breakpoints.  The thread_db
815  * library gives us an address where we can set a breakpoint.
816  * When the breakpoint is hit, it represents an event of interest
817  * such as:
818  *   Thread creation
819  *   Thread death
820  *   Thread reap
821  */
822
823 /* Location of the thread creation event breakpoint.  The code at this
824    location in the child process will be called by the pthread library
825    whenever a new thread is created.  By setting a special breakpoint
826    at this location, GDB can detect when a new thread is created.  We
827    obtain this location via the td_ta_event_addr call.  */
828
829 static CORE_ADDR thread_creation_bkpt_address;
830
831 /* Location of the thread death event breakpoint.  The code at this
832    location in the child process will be called by the pthread library
833    whenever a thread is destroyed.  By setting a special breakpoint at
834    this location, GDB can detect when a new thread is created.  We
835    obtain this location via the td_ta_event_addr call.  */
836
837 static CORE_ADDR thread_death_bkpt_address;
838
839 /* This function handles the global parts of enabling thread events.
840    The thread-specific enabling is handled per-thread elsewhere.  */
841
842 static void
843 enable_thread_event_reporting (td_thragent_t *ta)
844 {
845   td_thr_events_t events;
846   td_notify_t     notify;
847   CORE_ADDR       addr;
848
849   if (p_td_ta_set_event     == NULL ||
850       p_td_ta_event_addr    == NULL ||
851       p_td_ta_event_getmsg  == NULL ||
852       p_td_thr_event_enable == NULL)
853     return;     /* can't do thread event reporting without these funcs */
854
855   /* set process wide mask saying which events we are interested in */
856   td_event_emptyset (&events);
857   td_event_addset (&events, TD_CREATE);
858   td_event_addset (&events, TD_DEATH);
859
860   if (p_td_ta_set_event (ta, &events) != TD_OK)
861     {
862       warning ("unable to set global thread event mask");
863       return;
864     }
865
866   /* Delete previous thread event breakpoints, if any.  */
867   remove_thread_event_breakpoints ();
868
869   /* create breakpoints -- thread creation and death */
870   /* thread creation */
871   /* get breakpoint location */
872   if (p_td_ta_event_addr (ta, TD_CREATE, &notify) != TD_OK)
873     {
874       warning ("unable to get location for thread creation breakpoint");
875       return;
876     }
877
878   /* Set up the breakpoint. */
879   create_thread_event_breakpoint ((CORE_ADDR) notify.u.bptaddr);
880
881   /* Save it's location. */
882   thread_creation_bkpt_address = (CORE_ADDR) notify.u.bptaddr;
883
884   /* thread death */
885   /* get breakpoint location */
886   if (p_td_ta_event_addr (ta, TD_DEATH, &notify) != TD_OK)
887     {
888       warning ("unable to get location for thread death breakpoint");
889       return;
890     }
891   /* Set up the breakpoint. */
892   create_thread_event_breakpoint ((CORE_ADDR) notify.u.bptaddr);
893
894   /* Save it's location. */
895   thread_death_bkpt_address = (CORE_ADDR) notify.u.bptaddr;
896 }
897
898 /* This function handles the global parts of disabling thread events.
899    The thread-specific enabling is handled per-thread elsewhere.  */
900
901 static void
902 disable_thread_event_reporting (td_thragent_t *ta)
903 {
904   td_thr_events_t events;
905
906   /* set process wide mask saying we aren't interested in any events */
907   td_event_emptyset (&events);
908   p_td_ta_set_event (main_threadagent, &events);
909
910   /* Delete thread event breakpoints, if any.  */
911   remove_thread_event_breakpoints ();
912   thread_creation_bkpt_address = 0;
913   thread_death_bkpt_address = 0;
914 }
915
916 /* check_for_thread_event
917    
918    if it's a thread event we recognize (currently
919    we only recognize creation and destruction
920    events), return 1; else return 0.  */
921
922
923 static int
924 check_for_thread_event (struct target_waitstatus *tws, int event_pid)
925 {
926   /* FIXME: to be more efficient, we should keep a static 
927      list of threads, and update it only here (with td_ta_thr_iter). */
928   return 0;
929 }
930
931 static void
932 thread_db_push_target (void)
933 {
934   /* Called ONLY from thread_db_new_objfile after td_ta_new call succeeds. */
935
936   /* Push this target vector */
937   push_target (&thread_db_ops);
938   /* Find the underlying process-layer target for calling later.  */
939   target_beneath = find_target_beneath (&thread_db_ops);
940   using_thread_db = 1;
941   /* Turn on thread_db event-reporting API.  */
942   enable_thread_event_reporting (main_threadagent);
943 }
944
945 static void
946 thread_db_unpush_target (void)
947 {
948   /* Must be called whenever we remove ourself from the target stack! */
949
950   using_thread_db = 0;
951   target_beneath = NULL;
952
953   /* delete local list of threads */
954   empty_threadlist ();
955   /* Turn off the thread_db API.  */
956   p_td_ta_delete (main_threadagent);
957   /* Unpush this target vector */
958   unpush_target (&thread_db_ops);
959   /* Reset linuxthreads module.  */
960   linuxthreads_discard_global_state ();
961 }
962
963 /*
964  * New objfile hook function:
965  * Called for each new objfile (image, shared lib) in the target process.
966  *
967  * The purpose of this function is to detect that the target process
968  * is linked with the (appropriate) thread library.  So every time a
969  * new target shared library is detected, we will call td_ta_new.
970  * If it succeeds, we know we have a multi-threaded target process
971  * that we can debug using the thread_db API.
972  */
973
974 /* 
975  * new_objfile function:
976  *
977  * connected to target_new_objfile_hook, this function gets called
978  * every time a new binary image is loaded.
979  *
980  * At each call, we attempt to open the thread_db connection to the
981  * child process.  If it succeeds, we know we have a libthread process
982  * and we can debug it with this target vector.  Therefore we push
983  * ourself onto the target stack.
984  */
985
986 static void (*target_new_objfile_chain)   (struct objfile *objfile);
987 static int stop_or_attach_thread_callback (const td_thrhandle_t *th, 
988                                            void *data);
989 static int wait_thread_callback           (const td_thrhandle_t *th, 
990                                            void *data);
991
992 static void
993 thread_db_new_objfile (struct objfile *objfile)
994 {
995   td_err_e   ret;
996   
997   if (using_thread_db)                  /* libthread already detected, and */
998     goto quit;                          /* thread target vector activated. */
999
1000   if (objfile == NULL)
1001     goto quit;  /* un-interesting object file */
1002
1003   /* Initialize our "main prochandle" with the main inferior pid.  */
1004   main_prochandle.pid = PIDGET (inferior_ptid);
1005
1006   /* Now attempt to open a thread_db connection to the 
1007      thread library running in the child process.  */
1008   ret = p_td_ta_new (&main_prochandle, &main_threadagent);
1009   switch (ret) {
1010   default:
1011     warning ("Unexpected error initializing thread_db: %s", 
1012              thr_err_string (ret));
1013     break;
1014   case TD_NOLIBTHREAD:  /* expected: no libthread in child process (yet) */
1015     break;      
1016   case TD_OK:           /* libthread detected in child: we go live now! */
1017     thread_db_push_target ();
1018     event_pid = PIDGET (inferior_ptid); /* for resume */
1019
1020     /* Now stop everyone else, and attach any new threads you find.  */
1021     p_td_ta_thr_iter (main_threadagent, 
1022                       stop_or_attach_thread_callback,
1023                       (void *) 0,
1024                       TD_THR_ANY_STATE,
1025                       TD_THR_LOWEST_PRIORITY,
1026                       TD_SIGNO_MASK,
1027                       TD_THR_ANY_USER_FLAGS);
1028
1029     /* Now go call wait on all the threads you've stopped:
1030        This allows us to absorb the SIGKILL event, and to make sure
1031        that the thread knows that it is stopped (Linux peculiarity).  */
1032     p_td_ta_thr_iter (main_threadagent, 
1033                       wait_thread_callback,
1034                       (void *) 0,
1035                       TD_THR_ANY_STATE,
1036                       TD_THR_LOWEST_PRIORITY,
1037                       TD_SIGNO_MASK,
1038                       TD_THR_ANY_USER_FLAGS);
1039
1040     break;
1041   }
1042 quit:
1043   if (target_new_objfile_chain)
1044     target_new_objfile_chain (objfile);
1045 }
1046
1047
1048 /* 
1049
1050    LOCAL FUNCTION
1051
1052    thread_db_alive     - test thread for "aliveness"
1053
1054    SYNOPSIS
1055
1056    static bool thread_db_alive (int pid);
1057
1058    DESCRIPTION
1059
1060    returns true if thread still active in inferior.
1061
1062  */
1063
1064 static int
1065 thread_db_alive (ptid_t ptid)
1066 {
1067   if (is_thread (ptid))         /* user-space (non-kernel) thread */
1068     {
1069       td_thrhandle_t th;
1070       td_err_e ret;
1071       int pid = GET_THREAD (ptid);
1072
1073       if ((ret = p_td_ta_map_id2thr (main_threadagent, pid, &th)) != TD_OK)
1074         return 0;               /* thread not found */
1075       if ((ret = p_td_thr_validate (&th)) != TD_OK)
1076         return 0;               /* thread not valid */
1077       return 1;                 /* known thread: return true */
1078     }
1079   else if (target_beneath->to_thread_alive)
1080     return target_beneath->to_thread_alive (ptid);
1081   else
1082     return 0;           /* default to "not alive" (shouldn't happen anyway) */
1083 }
1084
1085 /*
1086  * get_lwp_from_thread_handle
1087  */
1088
1089 static int      /* lwpid_t or pid_t */
1090 get_lwp_from_thread_handle (td_thrhandle_t *th)
1091 {
1092   td_thrinfo_t ti;
1093   td_err_e     ret;
1094
1095   if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1096     error ("get_lwp_from_thread_handle: thr_get_info failed: %s", 
1097            thr_err_string (ret));
1098
1099   return ti.ti_lid;
1100 }
1101
1102 /*
1103  * get_lwp_from_thread_id
1104  */
1105
1106 static int      /* lwpid_t or pid_t */
1107 get_lwp_from_thread_id (int tid /* thread_t? */)
1108 {
1109   td_thrhandle_t th;
1110   td_err_e       ret;
1111
1112   if ((ret = p_td_ta_map_id2thr (main_threadagent, tid, &th)) != TD_OK)
1113     error ("get_lwp_from_thread_id: map_id2thr failed: %s", 
1114            thr_err_string (ret));
1115
1116   return get_lwp_from_thread_handle (&th);
1117 }
1118
1119 /* 
1120  * pid_to_str has to handle user-space threads.
1121  * If not a user-space thread, then pass the request on to the 
1122  * underlying stratum if it can handle it: else call normal_pid_to_str.
1123  */
1124
1125 static char *
1126 thread_db_pid_to_str (ptid_t ptid)
1127 {
1128   static char buf[100];
1129   td_thrhandle_t th;
1130   td_thrinfo_t ti;
1131   td_err_e ret;
1132
1133   if (is_thread (ptid))
1134     {
1135       if ((ret = p_td_ta_map_id2thr (main_threadagent, 
1136                                      GET_THREAD (ptid),
1137                                      &th)) != TD_OK)
1138         error ("thread_db: map_id2thr failed: %s", thr_err_string (ret));
1139
1140       if ((ret = p_td_thr_get_info (&th, &ti)) != TD_OK)
1141         error ("thread_db: thr_get_info failed: %s", thr_err_string (ret));
1142
1143       if (ti.ti_state == TD_THR_ACTIVE &&
1144           ti.ti_lid != 0)
1145         sprintf (buf, "Thread %ld (LWP %d)", ti.ti_tid, ti.ti_lid);
1146       else
1147         sprintf (buf, "Thread %ld (%s)", ti.ti_tid,
1148                  thr_state_string (ti.ti_state));
1149     }
1150   else if (GET_LWP (ptid))
1151     sprintf (buf, "LWP %ld", GET_LWP (ptid));
1152   else return normal_pid_to_str (ptid);
1153
1154   return buf;
1155 }
1156
1157 /* 
1158  * thread_db target vector functions:
1159  */
1160
1161 static void
1162 thread_db_files_info (struct target_ops *tgt_vector)
1163 {
1164   /* This function will be unnecessary in real life.  */
1165   printf_filtered ("thread_db stratum:\n");
1166   target_beneath->to_files_info (tgt_vector);
1167 }
1168
1169 /* 
1170  * xfer_memory has to munge the inferior_ptid before passing the call
1171  * down to the target layer.  
1172  */
1173
1174 static int
1175 thread_db_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int dowrite,
1176                        struct mem_attrib *attrib,
1177                        struct target_ops *target)
1178 {
1179   struct cleanup *old_chain;
1180   int ret;
1181
1182   old_chain = save_inferior_ptid ();
1183
1184   if (is_thread (inferior_ptid) ||
1185       !target_thread_alive (inferior_ptid))
1186     {
1187       /* FIXME: use the LID/LWP, so that underlying process layer
1188          can read memory from specific threads?  */
1189       inferior_ptid = pid_to_ptid (main_prochandle.pid);
1190     }
1191
1192   ret = target_beneath->to_xfer_memory (memaddr, myaddr, len,
1193                                         dowrite, attrib, target);
1194   do_cleanups (old_chain);
1195   return ret;
1196 }
1197
1198 /* 
1199  * fetch_registers has to determine if inferior_ptid is a user-space thread.
1200  * If so, we use the thread_db API to get the registers.
1201  * And if not, we call the underlying process stratum.
1202  */
1203
1204 static void
1205 thread_db_fetch_registers (int regno)
1206 {
1207   td_thrhandle_t thandle;
1208   gdb_prfpregset_t fpregset;
1209   prgregset_t gregset;
1210   thread_t thread;
1211   td_err_e ret;
1212
1213   if (!is_thread (inferior_ptid))       /* kernel thread */
1214     {                   /* pass the request on to the target underneath.  */
1215       target_beneath->to_fetch_registers (regno);
1216       return;
1217     }
1218
1219   /* convert inferior_ptid into a td_thrhandle_t */
1220
1221   if ((thread = GET_THREAD (inferior_ptid)) == 0)
1222     error ("fetch_registers:  thread == 0");
1223
1224   if ((ret = p_td_ta_map_id2thr (main_threadagent, thread, &thandle)) != TD_OK)
1225     error ("fetch_registers: td_ta_map_id2thr: %s", thr_err_string (ret));
1226
1227   /* Get the integer regs: 
1228      For the sparc, TD_PARTIALREG means that only i0->i7, l0->l7, 
1229      pc and sp are saved (by a thread context switch).  */
1230   if ((ret = p_td_thr_getgregs (&thandle, gregset)) != TD_OK &&
1231       ret != TD_PARTIALREG)
1232     error ("fetch_registers: td_thr_getgregs %s", thr_err_string (ret));
1233
1234   /* And, now the fp regs */
1235   if ((ret = p_td_thr_getfpregs (&thandle, &fpregset)) != TD_OK &&
1236       ret != TD_NOFPREGS)
1237     error ("fetch_registers: td_thr_getfpregs %s", thr_err_string (ret));
1238
1239 /* Note that we must call supply_{g fp}regset *after* calling the td routines
1240    because the td routines call ps_lget* which affect the values stored in the
1241    registers array.  */
1242
1243   supply_gregset ((gdb_gregset_t *) gregset);
1244   supply_fpregset (&fpregset);
1245
1246 }
1247
1248 /* 
1249  * store_registers has to determine if inferior_ptid is a user-space thread.
1250  * If so, we use the thread_db API to get the registers.
1251  * And if not, we call the underlying process stratum.
1252  */
1253
1254 static void
1255 thread_db_store_registers (int regno)
1256 {
1257   td_thrhandle_t thandle;
1258   gdb_prfpregset_t fpregset;
1259   prgregset_t  gregset;
1260   thread_t thread;
1261   td_err_e ret;
1262
1263   if (!is_thread (inferior_ptid))       /* Kernel thread: */
1264     {           /* pass the request on to the underlying target vector.  */
1265       target_beneath->to_store_registers (regno);
1266       return;
1267     }
1268
1269   /* convert inferior_ptid into a td_thrhandle_t */
1270
1271   if ((thread = GET_THREAD (inferior_ptid)) == 0)
1272     error ("store_registers: thread == 0");
1273
1274   if ((ret = p_td_ta_map_id2thr (main_threadagent, thread, &thandle)) != TD_OK)
1275     error ("store_registers: td_ta_map_id2thr %s", thr_err_string (ret));
1276
1277   if (regno != -1)
1278     {                           /* Not writing all the regs */
1279       /* save new register value */
1280       /* MVS: I don't understand this... */
1281       char old_value[REGISTER_SIZE];
1282
1283       memcpy (old_value, &registers[REGISTER_BYTE (regno)], REGISTER_SIZE);
1284
1285       if ((ret = p_td_thr_getgregs (&thandle, gregset)) != TD_OK)
1286         error ("store_registers: td_thr_getgregs %s", thr_err_string (ret));
1287       if ((ret = p_td_thr_getfpregs (&thandle, &fpregset)) != TD_OK)
1288         error ("store_registers: td_thr_getfpregs %s", thr_err_string (ret));
1289
1290       /* restore new register value */
1291       memcpy (&registers[REGISTER_BYTE (regno)], old_value, REGISTER_SIZE);
1292
1293     }
1294
1295   fill_gregset  ((gdb_gregset_t *) gregset, regno);
1296   fill_fpregset (&fpregset, regno);
1297
1298   if ((ret = p_td_thr_setgregs (&thandle, gregset)) != TD_OK)
1299     error ("store_registers: td_thr_setgregs %s", thr_err_string (ret));
1300   if ((ret = p_td_thr_setfpregs (&thandle, &fpregset)) != TD_OK &&
1301       ret != TD_NOFPREGS)
1302     error ("store_registers: td_thr_setfpregs %s", thr_err_string (ret));
1303 }
1304
1305 static void
1306 handle_new_thread (int tid,     /* user thread id */
1307                    int lid,     /* kernel thread id */
1308                    int verbose)
1309 {
1310   ptid_t gdb_ptid = BUILD_THREAD (tid, main_prochandle.pid);
1311   int wait_pid, wait_status;
1312
1313   if (verbose)
1314     printf_filtered ("[New %s]\n", target_pid_to_str (gdb_ptid));
1315   add_thread (gdb_ptid);
1316
1317   if (lid != main_prochandle.pid)
1318     {
1319       attach_thread (lid);
1320       /* According to the Eric Paire model, we now have to send
1321          the restart signal to the new thread -- however, empirically,
1322          I do not find that to be necessary.  */
1323       attach_pid = lid;
1324     }
1325 }
1326
1327 static void
1328 test_for_new_thread (int tid, int lid, int verbose)
1329 {
1330   if (!in_thread_list (BUILD_THREAD (tid, main_prochandle.pid)))
1331     handle_new_thread (tid, lid, verbose);
1332 }
1333
1334 /* 
1335  * Callback function that gets called once per USER thread 
1336  * (i.e., not kernel) thread by td_ta_thr_iter.
1337  */
1338
1339 static int
1340 find_new_threads_callback (const td_thrhandle_t *th, void *ignored)
1341 {
1342   td_thrinfo_t ti;
1343   td_err_e     ret;
1344
1345   if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1346     {
1347       warning ("find_new_threads_callback: %s", thr_err_string (ret));
1348       return -1;                /* bail out, get_info failed. */
1349     }
1350
1351   /* FIXME: 
1352      As things now stand, this should never detect a new thread.
1353      But if it does, we could be in trouble because we aren't calling
1354      wait_thread_callback for it.  */
1355   test_for_new_thread (ti.ti_tid, ti.ti_lid, 0);
1356   return 0;
1357 }
1358
1359 /* 
1360  * find_new_threads uses the thread_db iterator function to discover
1361  * user-space threads.  Then if the underlying process stratum has a
1362  * find_new_threads method, we call that too.
1363  */
1364
1365 static void
1366 thread_db_find_new_threads (void)
1367 {
1368   if (PIDGET (inferior_ptid) == -1)     /* FIXME: still necessary? */
1369     {
1370       printf_filtered ("No process.\n");
1371       return;
1372     }
1373   p_td_ta_thr_iter (main_threadagent, 
1374                     find_new_threads_callback, 
1375                     (void *) 0, 
1376                     TD_THR_ANY_STATE, 
1377                     TD_THR_LOWEST_PRIORITY,
1378                     TD_SIGNO_MASK, 
1379                     TD_THR_ANY_USER_FLAGS);
1380   if (target_beneath->to_find_new_threads)
1381     target_beneath->to_find_new_threads ();
1382 }
1383
1384 /*
1385  * Resume all threads, or resume a single thread.
1386  * If step is true, then single-step the appropriate thread
1387  * (or single-step inferior_ptid, but continue everyone else).
1388  * If signo is true, then send that signal to at least one thread.
1389  */
1390
1391 /*
1392  * This function is called once for each thread before resuming.
1393  * It sends continue (no step, and no signal) to each thread except
1394  *   the main thread, and
1395  *   the event thread (the one that stopped at a breakpoint etc.)
1396  *
1397  * The event thread is handled separately so that it can be sent
1398  * the stepping and signal args with which target_resume was called.
1399  *
1400  * The main thread is resumed last, so that the thread_db proc_service
1401  * callbacks will still work during the iterator function.
1402  */
1403
1404 static int
1405 resume_thread_callback (const td_thrhandle_t *th, void *data)
1406 {
1407   td_thrinfo_t ti;
1408   td_err_e     ret;
1409
1410   if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1411     {
1412       warning ("resume_thread_callback: %s", thr_err_string (ret));
1413       return -1;                /* bail out, get_info failed. */
1414     }
1415   /* FIXME: 
1416      As things now stand, this should never detect a new thread.
1417      But if it does, we could be in trouble because we aren't calling
1418      wait_thread_callback for it.  */
1419   test_for_new_thread (ti.ti_tid, ti.ti_lid, 1);
1420
1421   if (ti.ti_lid != main_prochandle.pid &&
1422       ti.ti_lid != event_pid)
1423     {
1424       /* Unconditionally continue the thread with no signal.
1425          Only the event thread will get a signal of any kind.  */
1426
1427       target_beneath->to_resume (pid_to_ptid (ti.ti_lid), 0, 0);
1428     }
1429   return 0;
1430 }
1431
1432 static int
1433 new_resume_thread_callback (threadinfo *thread, void *data)
1434 {
1435   if (thread->lid != event_pid &&
1436       thread->lid != main_prochandle.pid)
1437     {
1438       /* Unconditionally continue the thread with no signal (for now).  */
1439
1440       target_beneath->to_resume (pid_to_ptid (thread->lid), 0, 0);
1441     }
1442   return 0;
1443 }
1444
1445 static int last_resume_pid;
1446 static int last_resume_step;
1447 static int last_resume_signo;
1448
1449 static void
1450 thread_db_resume (ptid_t ptid, int step, enum target_signal signo)
1451 {
1452   last_resume_pid   = PIDGET (ptid);
1453   last_resume_step  = step;
1454   last_resume_signo = signo;
1455
1456   /* resuming a specific pid? */
1457   if (PIDGET (ptid) != -1)
1458     {
1459       if (is_thread (ptid))
1460         ptid = pid_to_ptid (get_lwp_from_thread_id (GET_THREAD (ptid)));
1461       else if (GET_LWP (ptid))
1462         ptid = pid_to_ptid (GET_LWP (ptid));
1463     }
1464
1465   /* Apparently the interpretation of 'pid' is dependent on 'step':
1466      If step is true, then a specific pid means 'step only this pid'.
1467      But if step is not true, then pid means 'continue ALL pids, but
1468      give the signal only to this one'.  */
1469   if (PIDGET (ptid) != -1 && step)
1470     {
1471       /* FIXME: is this gonna work in all circumstances? */
1472       target_beneath->to_resume (ptid, step, signo);
1473     }
1474   else
1475     {
1476       /* 1) Continue all threads except the event thread and the main thread.
1477          2) resume the event thread with step and signo.
1478          3) If event thread != main thread, continue the main thread.
1479
1480          Note: order of 2 and 3 may need to be reversed.  */
1481
1482       threadlist_iter (new_resume_thread_callback, 
1483                         (void *) 0, 
1484                         TD_THR_ANY_STATE, 
1485                         TD_THR_ANY_TYPE);
1486       /* now resume event thread, and if necessary also main thread. */
1487       if (event_pid)
1488         {
1489           target_beneath->to_resume (pid_to_ptid (event_pid), step, signo);
1490         }
1491       if (event_pid != main_prochandle.pid)
1492         {
1493           target_beneath->to_resume (pid_to_ptid (main_prochandle.pid), 0, 0);
1494         }
1495     }
1496 }
1497
1498 /* All new threads will be attached.
1499    All previously known threads will be stopped using kill (SIGKILL).  */
1500
1501 static int
1502 stop_or_attach_thread_callback (const td_thrhandle_t *th, void *data)
1503 {
1504   td_thrinfo_t ti;
1505   td_err_e     ret;
1506   ptid_t      gdb_ptid;
1507   int on_off = 1;
1508
1509   if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1510     {
1511       warning ("stop_or_attach_thread_callback: %s", thr_err_string (ret));
1512       return -1;                /* bail out, get_info failed. */
1513     }
1514
1515   /* First add it to our internal list.  
1516      We build this list anew at every wait event.  */
1517   insert_thread (ti.ti_tid, ti.ti_lid, ti.ti_state, ti.ti_type);
1518   /* Now: if we've already seen it, stop it, else add it and attach it.  */
1519   gdb_ptid = BUILD_THREAD (ti.ti_tid, main_prochandle.pid);
1520   if (!in_thread_list (gdb_ptid))       /* new thread */
1521     {
1522       handle_new_thread (ti.ti_tid, ti.ti_lid, 1);
1523       /* Enable thread events */
1524       if (p_td_thr_event_enable)
1525         if ((ret = p_td_thr_event_enable (th, on_off)) != TD_OK)
1526           warning ("stop_or_attach_thread: %s", thr_err_string (ret));
1527     }
1528   else if (ti.ti_lid != event_pid &&
1529            ti.ti_lid != main_prochandle.pid)
1530     {
1531       ret = (td_err_e) kill (ti.ti_lid, SIGSTOP);
1532     }
1533
1534   return 0;
1535 }
1536      
1537 /*
1538  * Wait for signal N from pid PID.
1539  * If wait returns any other signals, put them back before returning.
1540  */
1541
1542 static void
1543 wait_for_stop (int pid)
1544 {
1545   int i;
1546   int retpid;
1547   int status;
1548
1549   /* Array of wait/signal status */
1550   /* FIXME: wrong data structure, we need a queue.
1551      Realtime signals may be delivered more than once.  
1552      And at that, we really can't handle them (see below).  */
1553 #if defined (NSIG)
1554   static int   wstatus [NSIG];
1555 #elif defined (_NSIG)
1556   static int   wstatus [_NSIG];
1557 #else
1558 #error No definition for number of signals!
1559 #endif
1560
1561   /* clear wait/status list */
1562   memset (&wstatus, 0, sizeof (wstatus));
1563
1564   /* Now look for SIGSTOP event on all threads except event thread.  */
1565   do {
1566     errno = 0;
1567     if (pid == main_prochandle.pid)
1568       retpid = waitpid (pid, &status, 0);
1569     else
1570       retpid = waitpid (pid, &status, __WCLONE);
1571
1572     if (retpid > 0)
1573       if (WSTOPSIG (status) == SIGSTOP)
1574         {
1575           /* Got the SIGSTOP event we're looking for.
1576              Throw it away, and throw any other events back!  */
1577           for (i = 0; i < sizeof(wstatus) / sizeof (wstatus[0]); i++)
1578             if (wstatus[i])
1579               if (i != SIGSTOP)
1580                 {
1581                   kill (retpid, i);
1582                 }
1583           break;        /* all done */
1584         }
1585       else
1586         {
1587           int signo;
1588           /* Oops, got an event other than SIGSTOP.
1589              Save it, and throw it back after we find the SIGSTOP event.  */
1590           
1591           /* FIXME (how?)  This method is going to fail for realtime
1592              signals, which cannot be put back simply by using kill.  */
1593
1594           if (WIFEXITED (status))
1595             error ("Ack!  Thread Exited event.  What do I do now???");
1596           else if (WIFSTOPPED (status))
1597             signo = WSTOPSIG (status);
1598           else
1599             signo = WTERMSIG (status);
1600           
1601           /* If a thread other than the event thread has hit a GDB
1602              breakpoint (as opposed to some random trap signal), then
1603              just arrange for it to hit it again later.  Back up the
1604              PC if necessary.  Don't forward the SIGTRAP signal to
1605              the thread.  We will handle the current event, eventually
1606              we will resume all the threads, and this one will get
1607              it's breakpoint trap again.
1608
1609              If we do not do this, then we run the risk that the user
1610              will delete or disable the breakpoint, but the thread will
1611              have already tripped on it.  */
1612
1613           if (retpid != event_pid &&
1614               signo == SIGTRAP &&
1615               breakpoint_inserted_here_p (read_pc_pid (pid_to_ptid (retpid)) - 
1616                                           DECR_PC_AFTER_BREAK))
1617             {
1618               /* Set the pc to before the trap and DO NOT re-send the signal */
1619               if (DECR_PC_AFTER_BREAK)
1620                 write_pc_pid (read_pc_pid (pid_to_ptid (retpid)) 
1621                                 - DECR_PC_AFTER_BREAK,
1622                               pid_to_ptid (retpid));
1623             }
1624
1625           /* Since SIGINT gets forwarded to the entire process group
1626              (in the case where ^C is typed at the tty / console), 
1627              just ignore all SIGINTs from other than the event thread.  */
1628           else if (retpid != event_pid && signo == SIGINT)
1629             { /* do nothing.  Signal will disappear into oblivion!  */
1630               ;
1631             }
1632
1633           else /* This is some random signal other than a breakpoint. */
1634             {
1635               wstatus [signo] = 1;
1636             }
1637           child_resume (pid_to_ptid (retpid), 0, TARGET_SIGNAL_0);
1638           continue;
1639         }
1640
1641   } while (errno == 0 || errno == EINTR);
1642 }
1643
1644 /*
1645  * wait_thread_callback
1646  *
1647  * Calls waitpid for each thread, repeatedly if necessary, until
1648  * SIGSTOP is returned.  Afterward, if any other signals were returned
1649  * by waitpid, return them to the thread's pending queue by calling kill.
1650  */
1651
1652 static int
1653 wait_thread_callback (const td_thrhandle_t *th, void *data)
1654 {
1655   td_thrinfo_t ti;
1656   td_err_e     ret;
1657
1658   if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1659     {
1660       warning ("wait_thread_callback: %s", thr_err_string (ret));
1661       return -1;                /* bail out, get_info failed. */
1662     }
1663
1664   /* This callback to act on all threads except the event thread: */
1665   if (ti.ti_lid == event_pid ||         /* no need to wait (no sigstop) */
1666       ti.ti_lid == main_prochandle.pid) /* no need to wait (already waited) */
1667     return 0;   /* don't wait on the event thread.  */
1668
1669   wait_for_stop (ti.ti_lid);
1670   return 0;     /* finished: next thread. */
1671 }
1672
1673 static int
1674 new_wait_thread_callback (threadinfo *thread, void *data)
1675 {
1676   /* don't wait on the event thread -- it's already stopped and waited.  
1677      Ditto the main thread.  */
1678   if (thread->lid != event_pid &&
1679       thread->lid != main_prochandle.pid)
1680     {
1681       wait_for_stop (thread->lid);
1682     }
1683   return 0;
1684 }
1685
1686 /* 
1687  * Wait for any thread to stop, by calling the underlying wait method.
1688  * The PID returned by the underlying target may be a kernel thread,
1689  * in which case we will want to convert it to the corresponding
1690  * user-space thread.  
1691  */
1692
1693 static ptid_t
1694 thread_db_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
1695 {
1696   td_thrhandle_t thandle;
1697   td_thrinfo_t ti;
1698   td_err_e ret;
1699   lwpid_t lwp;
1700   int retpid;
1701   ptid_t retptid;
1702   int status;
1703   int save_errno;
1704
1705   /* OK, we're about to wait for an event from the running inferior.
1706      Make sure we're ignoring the right signals.  */
1707
1708   check_all_signal_numbers ();  /* see if magic signals changed. */
1709
1710   event_pid = 0;
1711   attach_pid = 0;
1712
1713   /* FIXME: should I do the wait right here inline?  */
1714 #if 0
1715   if (PIDGET (ptid) == -1)
1716     lwp = -1;
1717   else
1718     lwp = get_lwp_from_thread_id (GET_THREAD (ptid));
1719 #endif
1720
1721
1722   save_errno = linux_child_wait (-1, &retpid, &status);
1723   store_waitstatus (ourstatus, status);
1724
1725   /* Thread ID is irrelevant if the target process exited.
1726      FIXME: do I have any killing to do?
1727      Can I get this event mistakenly from a thread?  */
1728   if (ourstatus->kind == TARGET_WAITKIND_EXITED)
1729     return pid_to_ptid (retpid);
1730
1731   /* OK, we got an event of interest.
1732      Go stop all threads and look for new ones.
1733      FIXME: maybe don't do this for the restart signal?  Optimization...  */
1734   event_pid = retpid;
1735
1736   /* If the last call to resume was for a specific thread, then we don't
1737      need to stop everyone else: they should already be stopped.  */
1738   if (last_resume_step == 0 || last_resume_pid == -1)
1739     {
1740       /* Main thread must be stopped before calling the iterator.  */
1741       if (retpid != main_prochandle.pid)
1742         {
1743           kill (main_prochandle.pid, SIGSTOP);
1744           wait_for_stop (main_prochandle.pid);
1745         }
1746
1747       empty_threadlist ();
1748       /* Now stop everyone else, and attach any new threads you find.  */
1749       p_td_ta_thr_iter (main_threadagent, 
1750                         stop_or_attach_thread_callback,
1751                         (void *) 0,
1752                         TD_THR_ANY_STATE,
1753                         TD_THR_LOWEST_PRIORITY,
1754                         TD_SIGNO_MASK,
1755                         TD_THR_ANY_USER_FLAGS);
1756
1757       /* Now go call wait on all the threads we've stopped:
1758          This allows us to absorb the SIGKILL event, and to make sure
1759          that the thread knows that it is stopped (Linux peculiarity).  */
1760
1761       threadlist_iter (new_wait_thread_callback, 
1762                        (void *) 0,
1763                        TD_THR_ANY_STATE, 
1764                        TD_THR_ANY_TYPE);
1765     }
1766
1767   /* Convert the kernel thread id to the corresponding thread id.  */
1768
1769   /* If the process layer does not furnish an lwp,
1770      then perhaps the returned pid IS the lwp... */
1771 #if 0 /* Always true (if it'd compile...) */
1772   if ((lwp = GET_LWP (pid_to_ptid (retpid))) == 0)
1773 #endif
1774     lwp = retpid;
1775
1776   if ((ret = p_td_ta_map_lwp2thr (main_threadagent, lwp, &thandle)) != TD_OK)
1777     return pid_to_ptid (retpid); /* LWP is not mapped onto a user-space thread. */
1778
1779   if ((ret = p_td_thr_validate (&thandle)) != TD_OK)
1780     return pid_to_ptid (retpid);        /* LWP is not mapped onto a valid thread. */
1781
1782   if ((ret = p_td_thr_get_info (&thandle, &ti)) != TD_OK)
1783     {
1784       warning ("thread_db: thr_get_info failed ('%s')", thr_err_string (ret));
1785       return pid_to_ptid (retpid);
1786     }
1787
1788   retptid = BUILD_THREAD (ti.ti_tid, main_prochandle.pid);
1789   /* If this is a new user thread, notify GDB about it.  */
1790   if (!in_thread_list (retptid))
1791     {
1792       printf_filtered ("[New %s]\n", target_pid_to_str (retptid));
1793       add_thread (retptid);
1794     }
1795
1796 #if 0
1797   /* Now detect if this is a thread creation/deletion event: */
1798   check_for_thread_event (ourstatus, retpid);
1799 #endif
1800   return retptid;
1801 }
1802
1803 /* 
1804  * kill has to call the underlying kill.
1805  * FIXME: I'm not sure if it's necessary to check inferior_ptid any more,
1806  * but we might need to fix inferior_ptid up if it's a user thread.
1807  */
1808
1809 static int
1810 kill_thread_callback (const td_thrhandle_t *th, void *data)
1811 {
1812   td_thrinfo_t ti;
1813   td_err_e     ret;
1814
1815   /* Fixme: 
1816      For Linux, threads may need to be waited.  */
1817   if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1818     {
1819       warning ("kill_thread_callback: %s", thr_err_string (ret));
1820       return -1;                /* bail out, get_info failed. */
1821     }
1822
1823   if (ti.ti_lid != main_prochandle.pid)
1824     {
1825       kill (ti.ti_lid, SIGKILL);
1826     }
1827   return 0;
1828 }
1829
1830
1831 static void thread_db_kill (void)
1832 {
1833   int rpid;
1834   int status;
1835
1836   /* Fixme: 
1837      For Linux, threads may need to be waited.  */
1838   if (! ptid_equal (inferior_ptid, null_ptid))
1839     {
1840       /* Go kill the children first.  Save the main thread for last. */
1841       p_td_ta_thr_iter (main_threadagent, 
1842                         kill_thread_callback, 
1843                         (void *) 0, 
1844                         TD_THR_ANY_STATE,
1845                         TD_THR_LOWEST_PRIORITY,
1846                         TD_SIGNO_MASK,
1847                         TD_THR_ANY_USER_FLAGS);
1848
1849       /* Turn off thread_db event-reporting API *before* killing the
1850          main thread, since this operation requires child memory access.
1851          Can't move this into thread_db_unpush target because then 
1852          detach would not work.  */
1853       disable_thread_event_reporting (main_threadagent);
1854
1855       inferior_ptid = pid_to_ptid (main_prochandle.pid);
1856
1857       /* 
1858        * Since both procfs_kill and ptrace_kill call target_mourn, 
1859        * it should be sufficient for me to call one of them.
1860        * That will result in my mourn being called, which will both
1861        * unpush me and call the underlying mourn.
1862        */
1863       target_beneath->to_kill ();
1864     }
1865
1866   /* Wait for all threads. */
1867   /* FIXME: need a universal wait_for_signal func? */
1868   do
1869     {
1870       rpid = waitpid (-1, &status, __WCLONE | WNOHANG);
1871     }
1872   while (rpid > 0 || errno == EINTR);
1873
1874   do
1875     {
1876       rpid = waitpid (-1, &status, WNOHANG);
1877     }
1878   while (rpid > 0 || errno == EINTR);
1879 }
1880
1881 /* 
1882  * Mourn has to remove us from the target stack, 
1883  * and then call the underlying mourn.
1884  */
1885
1886 static void thread_db_mourn_inferior (void)
1887 {
1888   thread_db_unpush_target ();
1889   target_mourn_inferior ();     /* call the underlying mourn */
1890 }
1891
1892 /* 
1893  * Detach has to remove us from the target stack, 
1894  * and then call the underlying detach.
1895  *
1896  * But first, it has to detach all the cloned threads!
1897  */
1898
1899 static int
1900 detach_thread_callback (const td_thrhandle_t *th, void *data)
1901 {
1902   /* Called once per thread.  */
1903   td_thrinfo_t ti;
1904   td_err_e     ret;
1905
1906   if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1907     {
1908       warning ("detach_thread_callback: %s", thr_err_string (ret));
1909       return -1;                /* bail out, get_info failed. */
1910     }
1911
1912   if (!in_thread_list (BUILD_THREAD (ti.ti_tid, main_prochandle.pid)))
1913     return 0;   /* apparently we don't know this one.  */
1914
1915   /* Save main thread for last, or the iterator will fail! */
1916   if (ti.ti_lid != main_prochandle.pid)
1917     {
1918       struct cleanup *old_chain;
1919       int off = 0;
1920
1921       /* Time to detach this thread. 
1922          First disable thread_db event reporting for the thread.  */
1923       if (p_td_thr_event_enable &&
1924           (ret = p_td_thr_event_enable (th, off)) != TD_OK)
1925         {
1926           warning ("detach_thread_callback: %s\n", thr_err_string (ret));
1927           return 0;
1928         }
1929
1930       /* Now cancel any pending SIGTRAPS.  FIXME!  */
1931
1932       /* Call underlying detach method.  FIXME just detach it.  */
1933       old_chain = save_inferior_ptid ();
1934       inferior_ptid = pid_to_ptid (ti.ti_lid);
1935       detach (TARGET_SIGNAL_0);
1936       do_cleanups (old_chain);
1937     }
1938   return 0;
1939 }
1940
1941 static void
1942 thread_db_detach (char *args, int from_tty)
1943 {
1944   td_err_e ret;
1945
1946   if ((ret = p_td_ta_thr_iter (main_threadagent, 
1947                                detach_thread_callback, 
1948                                (void *) 0, 
1949                                TD_THR_ANY_STATE,
1950                                TD_THR_LOWEST_PRIORITY,
1951                                TD_SIGNO_MASK,
1952                                TD_THR_ANY_USER_FLAGS))
1953       != TD_OK)
1954     warning ("detach (thr_iter): %s", thr_err_string (ret));
1955
1956   /* Turn off thread_db event-reporting API 
1957      (before detaching the main thread) */
1958   disable_thread_event_reporting (main_threadagent);
1959
1960   thread_db_unpush_target ();
1961
1962   /* above call nullifies target_beneath, so don't use that! */
1963   inferior_ptid = pid_to_ptid (PIDGET (inferior_ptid));
1964   target_detach (args, from_tty);
1965 }
1966
1967
1968 /* 
1969  * We never want to actually create the inferior!
1970  *
1971  * If this is ever called, it means we were on the target stack
1972  * when the user said "run".  But we don't want to be on the new
1973  * inferior's target stack until the thread_db / libthread
1974  * connection is ready to be made.
1975  *
1976  * So, what shall we do?
1977  * Unpush ourselves from the stack, and then invoke
1978  * find_default_create_inferior, which will invoke the
1979  * appropriate process_stratum target to do the create.
1980  */
1981
1982 static void
1983 thread_db_create_inferior (char *exec_file, char *allargs, char **env)
1984 {
1985   thread_db_unpush_target ();
1986   find_default_create_inferior (exec_file, allargs, env);
1987 }
1988
1989 /* 
1990  * Thread_db target vector initializer.
1991  */
1992
1993 void
1994 init_thread_db_ops (void)
1995 {
1996   thread_db_ops.to_shortname        = "multi-thread";
1997   thread_db_ops.to_longname         = "multi-threaded child process.";
1998   thread_db_ops.to_doc              = "Threads and pthreads support.";
1999   thread_db_ops.to_files_info       = thread_db_files_info;
2000   thread_db_ops.to_create_inferior  = thread_db_create_inferior;
2001   thread_db_ops.to_detach           = thread_db_detach;
2002   thread_db_ops.to_wait             = thread_db_wait;
2003   thread_db_ops.to_resume           = thread_db_resume;
2004   thread_db_ops.to_mourn_inferior   = thread_db_mourn_inferior;
2005   thread_db_ops.to_kill             = thread_db_kill;
2006   thread_db_ops.to_xfer_memory      = thread_db_xfer_memory;
2007   thread_db_ops.to_fetch_registers  = thread_db_fetch_registers;
2008   thread_db_ops.to_store_registers  = thread_db_store_registers;
2009   thread_db_ops.to_thread_alive     = thread_db_alive;
2010   thread_db_ops.to_find_new_threads = thread_db_find_new_threads;
2011   thread_db_ops.to_pid_to_str       = thread_db_pid_to_str;
2012   thread_db_ops.to_stratum          = thread_stratum;
2013   thread_db_ops.to_has_thread_control = tc_schedlock;
2014   thread_db_ops.to_magic            = OPS_MAGIC;
2015 }
2016 #endif  /* HAVE_STDINT_H */
2017
2018 /*
2019  * Module constructor / initializer function.
2020  * If connection to thread_db dynamic library is successful, 
2021  * then initialize this module's target vectors and the 
2022  * new_objfile hook.
2023  */
2024
2025
2026 void
2027 _initialize_thread_db (void)
2028 {
2029 #ifdef HAVE_STDINT_H    /* stub out entire module, leave initializer empty */
2030   if (init_thread_db_library ())
2031     {
2032       init_thread_db_ops ();
2033       add_target (&thread_db_ops);
2034       /*
2035        * Hook up to the new_objfile event.
2036        * If someone is already there, arrange for him to be called
2037        * after we are.
2038        */
2039       target_new_objfile_chain = target_new_objfile_hook;
2040       target_new_objfile_hook  = thread_db_new_objfile;
2041     }
2042 #endif  /* HAVE_STDINT_H */
2043 }
2044