fix a race condition in the sched_use_tsc patch
[openwrt.git] / openwrt / toolchain / gdb / patches / 620-debian_static-thread-db.patch
1 Status: submitted similar patch 2004-12-08
2
3 This patch cleans up the initialization of thread_db. It works for static
4 binaries now. The vsyscall patches hide this problem, since new static
5 binaries will load the vsyscall DSO and then trigger thread_db; but
6 this is still a good cleanup.
7
8 Index: gdb-6.3/gdb/thread-db.c
9 ===================================================================
10 --- gdb-6.3.orig/gdb/thread-db.c 2004-10-08 16:29:56.000000000 -0400
11 +++ gdb-6.3/gdb/thread-db.c 2004-11-10 00:19:30.626530413 -0500
12 @@ -34,6 +34,7 @@
13 #include "target.h"
14 #include "regcache.h"
15 #include "solib-svr4.h"
16 +#include "observer.h"
17
18 #ifdef HAVE_GNU_LIBC_VERSION_H
19 #include <gnu/libc-version.h>
20 @@ -627,59 +628,49 @@ check_thread_signals (void)
21 #endif
22 }
23
24 +/* Check whether thread_db is usable. This function is called when
25 + an inferior is created (or otherwise acquired, e.g. attached to)
26 + and when new shared libraries are loaded into a running process. */
27 +
28 static void
29 -thread_db_new_objfile (struct objfile *objfile)
30 +check_for_thread_db (void)
31 {
32 td_err_e err;
33 + static int already_loaded;
34
35 /* First time through, report that libthread_db was successfuly
36 loaded. Can't print this in in thread_db_load as, at that stage,
37 - the interpreter and it's console haven't started. The real
38 - problem here is that libthread_db is loaded too early - it should
39 - only be loaded when there is a program to debug. */
40 - {
41 - static int dejavu;
42 - if (!dejavu)
43 - {
44 - Dl_info info;
45 - const char *library = NULL;
46 - /* Try dladdr. */
47 - if (dladdr ((*td_ta_new_p), &info) != 0)
48 - library = info.dli_fname;
49 - /* Try dlinfo? */
50 - if (library == NULL)
51 - /* Paranoid - don't let a NULL path slip through. */
52 - library = LIBTHREAD_DB_SO;
53 - printf_unfiltered ("Using host libthread_db library \"%s\".\n",
54 - library);
55 - dejavu = 1;
56 - }
57 - }
58 + the interpreter and it's console haven't started. */
59
60 - /* Don't attempt to use thread_db on targets which can not run
61 - (core files). */
62 - if (objfile == NULL || !target_has_execution)
63 + if (!already_loaded)
64 {
65 - /* All symbols have been discarded. If the thread_db target is
66 - active, deactivate it now. */
67 - if (using_thread_db)
68 - {
69 - gdb_assert (proc_handle.pid == 0);
70 - unpush_target (&thread_db_ops);
71 - using_thread_db = 0;
72 - }
73 + Dl_info info;
74 + const char *library = NULL;
75 + if (dladdr ((*td_ta_new_p), &info) != 0)
76 + library = info.dli_fname;
77 +
78 + /* Try dlinfo? */
79
80 - goto quit;
81 + if (library == NULL)
82 + /* Paranoid - don't let a NULL path slip through. */
83 + library = LIBTHREAD_DB_SO;
84 +
85 + printf_unfiltered ("Using host libthread_db library \"%s\".\n",
86 + library);
87 + already_loaded = 1;
88 }
89
90 if (using_thread_db)
91 /* Nothing to do. The thread library was already detected and the
92 target vector was already activated. */
93 - goto quit;
94 + return;
95 +
96 + /* Don't attempt to use thread_db on targets which can not run
97 + (executables not running yet, core files) for now. */
98 + if (!target_has_execution)
99 + return;
100
101 - /* Initialize the structure that identifies the child process. Note
102 - that at this point there is no guarantee that we actually have a
103 - child process. */
104 + /* Initialize the structure that identifies the child process. */
105 proc_handle.pid = GET_PID (inferior_ptid);
106
107 /* Now attempt to open a connection to the thread library. */
108 @@ -706,12 +697,24 @@ thread_db_new_objfile (struct objfile *o
109 thread_db_err_str (err));
110 break;
111 }
112 +}
113 +
114 +static void
115 +thread_db_new_objfile (struct objfile *objfile)
116 +{
117 + if (objfile != NULL)
118 + check_for_thread_db ();
119
120 -quit:
121 if (target_new_objfile_chain)
122 target_new_objfile_chain (objfile);
123 }
124
125 +static void
126 +check_for_thread_db_observer (struct target_ops *target, int from_tty)
127 +{
128 + check_for_thread_db ();
129 +}
130 +
131 /* Attach to a new thread. This function is called when we receive a
132 TD_CREATE event or when we iterate over all threads and find one
133 that wasn't already in our list. */
134 @@ -1366,5 +1369,8 @@ _initialize_thread_db (void)
135 /* Add ourselves to objfile event chain. */
136 target_new_objfile_chain = deprecated_target_new_objfile_hook;
137 deprecated_target_new_objfile_hook = thread_db_new_objfile;
138 +
139 + /* Register ourselves for the new inferior observer. */
140 + observer_attach_inferior_created (check_for_thread_db_observer);
141 }
142 }
143 Index: gdb-6.3/gdb/Makefile.in
144 ===================================================================
145 --- gdb-6.3.orig/gdb/Makefile.in 2004-11-09 23:04:57.000000000 -0500
146 +++ gdb-6.3/gdb/Makefile.in 2004-11-10 00:19:26.440347022 -0500
147 @@ -2626,7 +2626,8 @@ thread.o: thread.c $(defs_h) $(symtab_h)
148 $(gdbcmd_h) $(regcache_h) $(gdb_h) $(gdb_string_h) $(ui_out_h)
149 thread-db.o: thread-db.c $(defs_h) $(gdb_assert_h) $(gdb_proc_service_h) \
150 $(gdb_thread_db_h) $(bfd_h) $(gdbthread_h) $(inferior_h) \
151 - $(symfile_h) $(objfiles_h) $(target_h) $(regcache_h) $(solib_svr4_h)
152 + $(symfile_h) $(objfiles_h) $(target_h) $(regcache_h) $(solib_svr4_h) \
153 + $(observer_h)
154 top.o: top.c $(defs_h) $(gdbcmd_h) $(call_cmds_h) $(cli_cmds_h) \
155 $(cli_script_h) $(cli_setshow_h) $(cli_decode_h) $(symtab_h) \
156 $(inferior_h) $(target_h) $(breakpoint_h) $(gdbtypes_h) \
This page took 0.051577 seconds and 5 git commands to generate.