Append to input history file instead of overwriting it

Message ID 1417226462-11254-1-git-send-email-patrick@parcs.ath.cx
State New, archived
Headers

Commit Message

Patrick Palka Nov. 29, 2014, 2:01 a.m. UTC
  This patch makes readline append new history lines to the GDB history
file on exit instead of overwriting the entire history file on exit.
This change allows us to run multiple simultaneous GDB sessions without
having each session overwrite the added history of each other session on
exit.  It is particularly helpful when debugging GDB with GDB.

Does this look OK to commit?  Tested on x86_64-unknown-linux-gnu.

gdb/ChangeLog:

	* top.h (gdb_add_history): Declare.
	* top.c (command_count): New variable.
	(gdb_add_history): New function.
	(quit_force): Append to history file instead of overwriting it.
	(command_line_input): Use gdb_add_history instead of
	add_history.
	* event-top.c (command_line_handler): Likewise.
---
 gdb/event-top.c |  2 +-
 gdb/top.c       | 19 ++++++++++++++++---
 gdb/top.h       |  2 ++
 3 files changed, 19 insertions(+), 4 deletions(-)
  

Comments

Sergio Durigan Junior Dec. 1, 2014, 8:50 p.m. UTC | #1
On Friday, November 28 2014, Patrick Palka wrote:

> This patch makes readline append new history lines to the GDB history
> file on exit instead of overwriting the entire history file on exit.
> This change allows us to run multiple simultaneous GDB sessions without
> having each session overwrite the added history of each other session on
> exit.  It is particularly helpful when debugging GDB with GDB.
>
> Does this look OK to commit?  Tested on x86_64-unknown-linux-gnu.

Thanks, Patrick.

The patch makes sense to me, and it is a good thing to have, I agree.

> gdb/ChangeLog:
>
> 	* top.h (gdb_add_history): Declare.
> 	* top.c (command_count): New variable.
> 	(gdb_add_history): New function.
> 	(quit_force): Append to history file instead of overwriting it.
> 	(command_line_input): Use gdb_add_history instead of
> 	add_history.
> 	* event-top.c (command_line_handler): Likewise.
> ---
>  gdb/event-top.c |  2 +-
>  gdb/top.c       | 19 ++++++++++++++++---
>  gdb/top.h       |  2 ++
>  3 files changed, 19 insertions(+), 4 deletions(-)
>
> diff --git a/gdb/event-top.c b/gdb/event-top.c
> index cb438ac..490bca6 100644
> --- a/gdb/event-top.c
> +++ b/gdb/event-top.c
> @@ -667,7 +667,7 @@ command_line_handler (char *rl)
>  
>    /* Add line to history if appropriate.  */
>    if (*linebuffer && input_from_terminal_p ())
> -    add_history (linebuffer);
> +    gdb_add_history (linebuffer);
>  
>    /* Note: lines consisting solely of comments are added to the command
>       history.  This is useful when you type a command, and then
> diff --git a/gdb/top.c b/gdb/top.c
> index c4b5c2c..6ec3acc 100644
> --- a/gdb/top.c
> +++ b/gdb/top.c
> @@ -895,7 +895,20 @@ gdb_rl_operate_and_get_next (int count, int key)
>  
>    return rl_newline (1, key);
>  }
> -
> +
> +/* Number of user commands executed during this session.  */
> +
> +static int command_count;

You should initialize this variable.

Other than that, looks good.  Let's wait for a maintainer to take a
look.

> +
> +/* Add the user command COMMAND to the input history list.  */
> +
> +void
> +gdb_add_history (const char *command)
> +{
> +  add_history (command);
> +  command_count++;
> +}
> +
>  /* Read one line from the command input stream `instream'
>     into the local static buffer `linebuffer' (whose current length
>     is `linelength').
> @@ -1090,7 +1103,7 @@ command_line_input (char *prompt_arg, int repeat, char *annotation_suffix)
>  
>    /* Add line to history if appropriate.  */
>    if (*linebuffer && input_from_terminal_p ())
> -    add_history (linebuffer);
> +    gdb_add_history (linebuffer);
>  
>    /* Save into global buffer if appropriate.  */
>    if (repeat)
> @@ -1441,7 +1454,7 @@ quit_force (char *args, int from_tty)
>      {
>        if (write_history_p && history_filename
>  	  && input_from_terminal_p ())
> -	write_history (history_filename);
> +	append_history (command_count, history_filename);
>      }
>    DO_PRINT_EX;
>  
> diff --git a/gdb/top.h b/gdb/top.h
> index 94f6c48..d8baea8 100644
> --- a/gdb/top.h
> +++ b/gdb/top.h
> @@ -79,6 +79,8 @@ extern int history_expansion_p;
>  extern int server_command;
>  extern char *lim_at_start;
>  
> +extern void gdb_add_history (const char *);
> +
>  extern void show_commands (char *args, int from_tty);
>  
>  extern void set_history (char *, int);
> -- 
> 2.2.0.rc1.23.gf570943
  
Pedro Alves Dec. 4, 2014, 4:18 p.m. UTC | #2
On 11/29/2014 02:01 AM, Patrick Palka wrote:
> This patch makes readline append new history lines to the GDB history
> file on exit instead of overwriting the entire history file on exit.
> This change allows us to run multiple simultaneous GDB sessions without
> having each session overwrite the added history of each other session on
> exit.  It is particularly helpful when debugging GDB with GDB.
> 
> Does this look OK to commit?  Tested on x86_64-unknown-linux-gnu.

Does this mean the history file will keep growing forever, rather than
be trimmed by the history size?

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/event-top.c b/gdb/event-top.c
index cb438ac..490bca6 100644
--- a/gdb/event-top.c
+++ b/gdb/event-top.c
@@ -667,7 +667,7 @@  command_line_handler (char *rl)
 
   /* Add line to history if appropriate.  */
   if (*linebuffer && input_from_terminal_p ())
-    add_history (linebuffer);
+    gdb_add_history (linebuffer);
 
   /* Note: lines consisting solely of comments are added to the command
      history.  This is useful when you type a command, and then
diff --git a/gdb/top.c b/gdb/top.c
index c4b5c2c..6ec3acc 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -895,7 +895,20 @@  gdb_rl_operate_and_get_next (int count, int key)
 
   return rl_newline (1, key);
 }
-
+
+/* Number of user commands executed during this session.  */
+
+static int command_count;
+
+/* Add the user command COMMAND to the input history list.  */
+
+void
+gdb_add_history (const char *command)
+{
+  add_history (command);
+  command_count++;
+}
+
 /* Read one line from the command input stream `instream'
    into the local static buffer `linebuffer' (whose current length
    is `linelength').
@@ -1090,7 +1103,7 @@  command_line_input (char *prompt_arg, int repeat, char *annotation_suffix)
 
   /* Add line to history if appropriate.  */
   if (*linebuffer && input_from_terminal_p ())
-    add_history (linebuffer);
+    gdb_add_history (linebuffer);
 
   /* Save into global buffer if appropriate.  */
   if (repeat)
@@ -1441,7 +1454,7 @@  quit_force (char *args, int from_tty)
     {
       if (write_history_p && history_filename
 	  && input_from_terminal_p ())
-	write_history (history_filename);
+	append_history (command_count, history_filename);
     }
   DO_PRINT_EX;
 
diff --git a/gdb/top.h b/gdb/top.h
index 94f6c48..d8baea8 100644
--- a/gdb/top.h
+++ b/gdb/top.h
@@ -79,6 +79,8 @@  extern int history_expansion_p;
 extern int server_command;
 extern char *lim_at_start;
 
+extern void gdb_add_history (const char *);
+
 extern void show_commands (char *args, int from_tty);
 
 extern void set_history (char *, int);