This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


On Wed, 19 Mar 2008 09:10:56 +0100, Jan Kratochvil wrote:
> 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.

The patch was approved by the readline maintainer:

On Fri, 21 Mar 2008 19:37:31 +0100, Chet Ramey wrote:
> I will add something like your block_sigint/release_sigint changes around
> the guts of rl_redisplay.  That's the right thing to do anyway.  It will
> probably not come out as a patch for readline-5.2; you can use your
> current patch (though the names will change to _rl_block_sigint and
> _rl_release_sigint -- fair warning).

It could be probably also coded only in GDB by modifying the function pointer
RL_REDISPLAY_FUNCTION instead to a custom wrapper calling RL_REDISPLAY but it
would need the SIGINT blocking/handling done in GDB.

OK to commit as a readline fork before readline-6 is here?


Regards,
Jan
2008-03-21  Jan Kratochvil  <jan.kratochvil@redhat.com>

	PR gdb/544
	* display.c (rl_redisplay): Wrap the function by the calls to
	BLOCK_SIGINT and RELEASE_SIGINT.
	* rltty.c (block_sigint, release_sigint): Make the functions global.
	* rltty.h (block_sigint, release_sigint): New prototypes.

--- ./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_ */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]