]> git.pld-linux.org Git - packages/gdb.git/blame - gdb-readline-6.0-signal.patch
- NOTE: does not build with -j2
[packages/gdb.git] / gdb-readline-6.0-signal.patch
CommitLineData
ab050a48
BZ
1http://sourceware.org/ml/gdb-patches/2009-11/msg00596.html
2Subject: [gdb FYI-patch] callback-mode readline-6.0 regression
3
4Hi Chet,
5
6FSF GDB currently ships bundled with readline-5.2 which works fine.
7But using --with-system-readline and readline-6.0-patchlevel4 has
8a regression:
9
10readline-5.2: Run `gdb -nx -q' and type CTRL-C:
11(gdb) Quit
12(gdb) _
13
14readline-6.0: Run `gdb -nx -q' and type CTRL-C:
15(gdb) _
16 = nothing happens (it gets buffered and executed later)
17 (It does also FAIL on gdb.gdb/selftest.exp.)
18
19It is because GDB waits in its own poll() mainloop and readline uses via
20rl_callback_handler_install and rl_callback_handler_remove. This way the
21readline internal variable _rl_interrupt_immediately remains 0 and CTRL-C gets
22only stored to _rl_caught_signal but not executed.
23
24Seen in rl_signal_handler even if _rl_interrupt_immediately is set and
25_rl_handle_signal is called then the signal is still stored to
26_rl_caught_signal. In the _rl_interrupt_immediately case it should not be
27stored when it was already processed.
28
29rl_signal_handler does `_rl_interrupt_immediately = 0;' - while I am not aware
30of its meaning it breaks the nest-counting of other routines which do
31`_rl_interrupt_immediately++;' and `_rl_interrupt_immediately--;' possibly
32creating problematic `_rl_interrupt_immediately == -1'.
33
34`_rl_interrupt_immediately' is an internal variable, how it could be accessed
35by a readline application? (OK, maybe it should not be used.)
36
37Attaching a current GDB-side patch but it must access readline internal
38variable _rl_caught_signal and it is generally just a workaround. Could you
39please include support for signals in this asynchronous mode in readline-6.1?
40I find it would be enough to make RL_CHECK_SIGNALS public?
41
42
43GDB: No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.
44But this is not a patch intended to be accepted.
45
46
47Thanks,
48Jan
49
50
51gdb/
522009-11-29 Jan Kratochvil <jan.kratochvil@redhat.com>
53
54 * config.in, configure: Regenerate.
55 * configure.ac (for readline_echoing_p): Move inside $LIBS change.
56 (for _rl_caught_signal): New.
57 * event-loop.c: Include readline/readline.h.
58 (gdb_do_one_event) [HAVE_READLINE_CAUGHT_SIGNAL]: New.
59
60gdb/testsuite/
612009-11-29 Jan Kratochvil <jan.kratochvil@redhat.com>
62
63 * gdb.gdb/selftest.exp (backtrace through signal handler): Move before
64 SIGINT pass, drop the timeout case.
65 (send SIGINT signal to child process): Use gdb_test.
66 (backtrace through readline handler): New.
67
68--- a/gdb/config.in
69+++ b/gdb/config.in
70@@ -351,6 +351,9 @@
71 /* Define if Python interpreter is being linked in. */
72 #undef HAVE_PYTHON
73
74+/* readline-6.0 workaround of blocked signals. */
75+#undef HAVE_READLINE_CAUGHT_SIGNAL
76+
77 /* Define to 1 if you have the `realpath' function. */
78 #undef HAVE_REALPATH
79
80--- a/gdb/configure.ac
81+++ b/gdb/configure.ac
82@@ -539,17 +539,25 @@ if test "$with_system_readline" = yes; then
83 # readline-6.0 started to use the name `_rl_echoing_p'.
84 # `$(READLINE_DIR)/' of bundled readline would not resolve in configure.
85
86- AC_MSG_CHECKING([for readline_echoing_p])
87 save_LIBS=$LIBS
88 LIBS="$LIBS $READLINE"
89+ AC_MSG_CHECKING([for readline_echoing_p])
90 AC_LINK_IFELSE(AC_LANG_PROGRAM(,[[extern int readline_echoing_p;
91 return readline_echoing_p;]]),
92 [READLINE_ECHOING_P=yes],
93 [READLINE_ECHOING_P=no
94 AC_DEFINE([readline_echoing_p], [_rl_echoing_p],
95 [readline-6.0 started to use different name.])])
96- LIBS="$save_LIBS"
97 AC_MSG_RESULT([$READLINE_ECHOING_P])
98+ AC_MSG_CHECKING([for _rl_caught_signal])
99+ AC_LINK_IFELSE(AC_LANG_PROGRAM(,[[extern int volatile _rl_caught_signal;
100+ return _rl_caught_signal;]]),
101+ [READLINE_CAUGHT_SIGNAL=yes
102+ AC_DEFINE([HAVE_READLINE_CAUGHT_SIGNAL],,
103+ [readline-6.0 workaround of blocked signals.])],
104+ [READLINE_CAUGHT_SIGNAL=no])
105+ AC_MSG_RESULT([$READLINE_CAUGHT_SIGNAL])
106+ LIBS="$save_LIBS"
107 else
108 READLINE='$(READLINE_DIR)/libreadline.a'
109 READLINE_DEPS='$(READLINE)'
110--- a/gdb/event-loop.c
111+++ b/gdb/event-loop.c
112@@ -37,6 +37,7 @@
113 #include "exceptions.h"
114 #include "gdb_assert.h"
115 #include "gdb_select.h"
116+#include "readline/readline.h"
117
118 /* Data point to pass to the event handler. */
119 typedef union event_data
120@@ -411,6 +412,9 @@ gdb_do_one_event (void *data)
121 static int event_source_head = 0;
122 const int number_of_sources = 3;
123 int current = 0;
124+#ifdef HAVE_READLINE_CAUGHT_SIGNAL
125+ extern int volatile _rl_caught_signal;
126+#endif
127
128 /* Any events already waiting in the queue? */
129 if (process_event ())
130@@ -455,6 +459,16 @@ gdb_do_one_event (void *data)
131 if (gdb_wait_for_event (1) < 0)
132 return -1;
133
134+#ifdef HAVE_READLINE_CAUGHT_SIGNAL
135+ if (async_command_editing_p && RL_ISSTATE (RL_STATE_CALLBACK)
136+ && _rl_caught_signal)
137+ {
138+ /* Call RL_CHECK_SIGNALS this way. */
139+ rl_callback_handler_remove ();
140+ rl_callback_handler_install (NULL, input_handler);
141+ }
142+#endif
143+
144 /* Handle any new events occurred while waiting. */
145 if (process_event ())
146 return 1;
147--- a/gdb/testsuite/gdb.gdb/selftest.exp
148+++ b/gdb/testsuite/gdb.gdb/selftest.exp
149@@ -464,31 +464,42 @@ GDB.*Copyright \[0-9\]+ Free Software Foundation, Inc..*$gdb_prompt $"\
150 fail "$description (timeout)"
151 }
152 }
153-
154- set description "send SIGINT signal to child process"
155- send_gdb "signal SIGINT\n"
156- gdb_expect {
157- -re "Continuing with signal SIGINT.*$gdb_prompt $" {
158+
159+ # get a stack trace with the poll function
160+ #
161+ # This fails on some linux systems for unknown reasons. On the
162+ # systems where it fails, sometimes it works fine when run manually.
163+ # The testsuite failures may not be limited to just aout systems.
164+ setup_xfail "i*86-pc-linuxaout-gnu"
165+ set description "backtrace through signal handler"
166+ gdb_test_multiple "backtrace" $description {
167+ -re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
168 pass "$description"
169 }
170 -re ".*$gdb_prompt $" {
171+ # On the alpha, we hit the infamous problem about gdb
172+ # being unable to get the frame pointer (mentioned in
173+ # gdb/README). As it is intermittent, there is no way to
174+ # XFAIL it which will give us an XPASS if the problem goes
175+ # away.
176+ setup_xfail "alpha*-*-osf*"
177 fail "$description"
178 }
179- timeout {
180- fail "$description (timeout)"
181- }
182 }
183
184- # get a stack trace
185+ gdb_test "signal SIGINT" "Continuing with signal SIGINT.*" \
186+ "send SIGINT signal to child process"
187+
188+ # get a stack trace being redelivered by readline
189 #
190 # This fails on some linux systems for unknown reasons. On the
191 # systems where it fails, sometimes it works fine when run manually.
192 # The testsuite failures may not be limited to just aout systems.
193+ # Optional system readline may not have symbols to be shown.
194 setup_xfail "i*86-pc-linuxaout-gnu"
195- set description "backtrace through signal handler"
196- send_gdb "backtrace\n"
197- gdb_expect {
198- -re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
199+ set description "backtrace through readline handler"
200+ gdb_test_multiple "backtrace" $description {
201+ -re "#0.*gdb_do_one_event.*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
202 pass "$description"
203 }
204 -re ".*$gdb_prompt $" {
205@@ -500,9 +510,6 @@ GDB.*Copyright \[0-9\]+ Free Software Foundation, Inc..*$gdb_prompt $"\
206 setup_xfail "alpha*-*-osf*"
207 fail "$description"
208 }
209- timeout {
210- fail "$description (timeout)"
211- }
212 }
213
214
215--- gdb-7.0/gdb/configure 2009-12-07 18:53:30.000000000 +0100
216+++ gdb-7.0-x/gdb/configure 2009-12-07 18:53:14.000000000 +0100
217@@ -9201,15 +9201,11 @@ if test "$with_system_readline" = yes; t
218 # readline-6.0 started to use the name `_rl_echoing_p'.
219 # `$(READLINE_DIR)/' of bundled readline would not resolve in configure.
220
221- echo "$as_me:$LINENO: checking for readline_echoing_p" >&5
222-echo $ECHO_N "checking for readline_echoing_p... $ECHO_C" >&6
223 save_LIBS=$LIBS
224 LIBS="$LIBS $READLINE"
225- cat >conftest.$ac_ext <<_ACEOF
226-/* confdefs.h. */
227-_ACEOF
228-cat confdefs.h >>conftest.$ac_ext
229-cat >>conftest.$ac_ext <<_ACEOF
230+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline_echoing_p" >&5
231+$as_echo_n "checking for readline_echoing_p... " >&6; }
232+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
233 /* end confdefs.h. */
234
235 int
236@@ -9221,45 +9217,45 @@ extern int readline_echoing_p;
237 return 0;
238 }
239 _ACEOF
240-rm -f conftest.$ac_objext conftest$ac_exeext
241-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
242- (eval $ac_link) 2>conftest.er1
243- ac_status=$?
244- grep -v '^ *+' conftest.er1 >conftest.err
245- rm -f conftest.er1
246- cat conftest.err >&5
247- echo "$as_me:$LINENO: \$? = $ac_status" >&5
248- (exit $ac_status); } &&
249- { ac_try='test -z "$ac_c_werror_flag"
250- || test ! -s conftest.err'
251- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
252- (eval $ac_try) 2>&5
253- ac_status=$?
254- echo "$as_me:$LINENO: \$? = $ac_status" >&5
255- (exit $ac_status); }; } &&
256- { ac_try='test -s conftest$ac_exeext'
257- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
258- (eval $ac_try) 2>&5
259- ac_status=$?
260- echo "$as_me:$LINENO: \$? = $ac_status" >&5
261- (exit $ac_status); }; }; then
262+if ac_fn_c_try_link "$LINENO"; then :
263 READLINE_ECHOING_P=yes
264 else
265- echo "$as_me: failed program was:" >&5
266-sed 's/^/| /' conftest.$ac_ext >&5
267+ READLINE_ECHOING_P=no
268
269-READLINE_ECHOING_P=no
270+$as_echo "#define readline_echoing_p _rl_echoing_p" >>confdefs.h
271+
272+fi
273+rm -f core conftest.err conftest.$ac_objext \
274+ conftest$ac_exeext conftest.$ac_ext
275+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_ECHOING_P" >&5
276+$as_echo "$READLINE_ECHOING_P" >&6; }
277+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _rl_caught_signal" >&5
278+$as_echo_n "checking for _rl_caught_signal... " >&6; }
279+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
280+/* end confdefs.h. */
281
282-cat >>confdefs.h <<\_ACEOF
283-#define readline_echoing_p _rl_echoing_p
284+int
285+main ()
286+{
287+extern int volatile _rl_caught_signal;
288+ return _rl_caught_signal;
289+ ;
290+ return 0;
291+}
292 _ACEOF
293+if ac_fn_c_try_link "$LINENO"; then :
294+ READLINE_CAUGHT_SIGNAL=yes
295+
296+$as_echo "#define HAVE_READLINE_CAUGHT_SIGNAL /**/" >>confdefs.h
297
298+else
299+ READLINE_CAUGHT_SIGNAL=no
300 fi
301-rm -f conftest.err conftest.$ac_objext \
302- conftest$ac_exeext conftest.$ac_ext
303+rm -f core conftest.err conftest.$ac_objext \
304+ conftest$ac_exeext conftest.$ac_ext
305+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_CAUGHT_SIGNAL" >&5
306+$as_echo "$READLINE_CAUGHT_SIGNAL" >&6; }
307 LIBS="$save_LIBS"
308- echo "$as_me:$LINENO: result: $READLINE_ECHOING_P" >&5
309-echo "${ECHO_T}$READLINE_ECHOING_P" >&6
310 else
311 READLINE='$(READLINE_DIR)/libreadline.a'
312 READLINE_DEPS='$(READLINE)'
This page took 0.064709 seconds and 4 git commands to generate.