Re: [patch] Fix testsuite annotate-quit race (PR 544)

Jan Kratochvil
2008-03-19T08:11:34Z

[-- Attachment #1: Type: text/plain, Size: 1254 bytes --]

Hi,

original post:
http://sourceware.org/ml/gdb-patches/2008-03/msg00262.html

On Wed, 19 Mar 2008 00:17:38 +0100, Daniel Jacobowitz wrote:
> On Tue, Mar 18, 2008 at 11:54:36PM +0100, Jan Kratochvil wrote:
> > Hi,
> >
> > PR 544 des gdb.cp/annota2.exp and gdb.cp/annota3.exp sometimes FAIL with:
> > FAIL: gdb.cp/annota3.exp: annotate-quit (pattern 1)
...
> Isn't this a bug in GDB, not a bug in the test?

You are right it is probably better to fix it in readline.
There are two excessive GDB prompts displayed as seen in strace:

write(1, "\n\32\32pre-prompt\n(gdb) \n\32\32prompt\n", 30) = 30
--- SIGINT (Interrupt) @ 0 (0) ---
write(1, "\n\32\32pre-prompt\n(gdb) \n\32\32prompt\n\n\32\32pre-prompt\n(gdb) \n\32\32prompt\n", 60) = 60

One can put `sleep (1)' at the end of _RL_OUTPUT_SOME_CHARS and type
p 1<enter><ctrl-c>
to abort the prompt printing. Before the patch:
(gdb) p 1
$1 = 1
Quit) (gdb)
(gdb) _
After the patch:
[bash]jkratoch@host0.dyn.jankratochvil.net:/home/jkratoch/redhat/sources/readline# ../gdb/gdb -nx -silent(gdb) p 1
$1 = 1
(gdb) Quit
(gdb) _

There are no testsuite regressions on Fedora 8 x86_64.
The problem reproduced the same on readline-5.2.
There will be needed a GDB patch to close PR 544.

Regards,
Jan

[-- Attachment #2: readline-display-blockint.patch --]
[-- Type: text/plain, Size: 1735 bytes --]

--- readline/display.c 5 May 2006 18:26:12 -0000 1.11
+++ readline/display.c 19 Mar 2008 05:10:16 -0000
@@ -463,6 +463,10 @@ rl_redisplay ()
if (!readline_echoing_p)
return;

+ /* Signals are blocked through this function as the global data structures
+ could get corrupted upon modifications from an invoked signal handler. */
+ block_sigint ();
+
if (!rl_display_prompt)
rl_display_prompt = "";

@@ -1139,6 +1143,8 @@ rl_redisplay ()
else
visible_wrap_offset = wrap_offset;
}
+
+ release_sigint ();
}

/* PWP: update_line() is based on finding the middle difference of each
--- readline/rltty.c 5 May 2006 18:26:12 -0000 1.9
+++ readline/rltty.c 19 Mar 2008 05:10:16 -0000
@@ -52,8 +52,8 @@ extern int errno;
rl_vintfunc_t *rl_prep_term_function = rl_prep_terminal;
rl_voidfunc_t *rl_deprep_term_function = rl_deprep_terminal;

-static void block_sigint PARAMS((void));
-static void release_sigint PARAMS((void));
+void block_sigint PARAMS((void));
+void release_sigint PARAMS((void));

static void set_winsize PARAMS((int));

@@ -75,7 +75,7 @@ static int sigint_blocked;

/* Cause SIGINT to not be delivered until the corresponding call to
release_sigint(). */
-static void
+void
block_sigint ()
{
if (sigint_blocked)
@@ -100,7 +100,7 @@ block_sigint ()
}

/* Allow SIGINT to be delivered. */
-static void
+void
release_sigint ()
{
if (sigint_blocked == 0)
--- readline/rltty.h 5 May 2006 18:26:12 -0000 1.5
+++ readline/rltty.h 19 Mar 2008 05:10:16 -0000
@@ -79,4 +79,7 @@ typedef struct _rl_tty_chars {
unsigned char t_status;
} _RL_TTY_CHARS;

+extern void block_sigint PARAMS((void));
+extern void release_sigint PARAMS((void));
+
#endif /* _RLTTY_H_ */