From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19138 invoked by alias); 2 Sep 2010 14:54:00 -0000 Received: (qmail 19127 invoked by uid 22791); 2 Sep 2010 14:53:59 -0000 X-SWARE-Spam-Status: No, hits=-6.0 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_TD,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 02 Sep 2010 14:53:52 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o82Erngf029479 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 2 Sep 2010 10:53:50 -0400 Received: from host1.dyn.jankratochvil.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o82ErlbP010365 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 2 Sep 2010 10:53:49 -0400 Received: from host1.dyn.jankratochvil.net (localhost [127.0.0.1]) by host1.dyn.jankratochvil.net (8.14.4/8.14.4) with ESMTP id o82Erlwf020071 for ; Thu, 2 Sep 2010 16:53:47 +0200 Received: (from jkratoch@localhost) by host1.dyn.jankratochvil.net (8.14.4/8.14.4/Submit) id o82Erka2020066 for gdb-patches@sourceware.org; Thu, 2 Sep 2010 16:53:46 +0200 Date: Thu, 02 Sep 2010 15:21:00 -0000 From: Jan Kratochvil To: gdb-patches@sourceware.org Subject: ping: [patch] set logging {redirect|overwrite} warning Message-ID: <20100902145346.GA19965@host1.dyn.jankratochvil.net> References: <20100806182919.GA3654@host1.dyn.jankratochvil.net> <201008121707.46348.pedro@codesourcery.com> <20100813215541.GA17278@host1.dyn.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100813215541.GA17278@host1.dyn.jankratochvil.net> User-Agent: Mutt/1.5.20 (2009-12-10) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-09/txt/msg00090.txt.bz2 There are some more dependencies around these redirections to fix so this one could go in first: On Fri, 13 Aug 2010 23:55:42 +0200, Jan Kratochvil wrote: On Thu, 12 Aug 2010 18:07:46 +0200, Pedro Alves wrote: > "set logging redirect" could take affect on the fly; OK... implemented. > Any reason to not use "warning" instead of "fprintf_unfiltered"? > (if you switch, remember to drop \n). Done. > I'd suggest s/Already/Currently/ and s/You should//. Done. > Since there's more than one place with the same string, it'd be nice > to abstract that out to a "warn_reenable_logging_to_take_effect" > function, or some such. As there remainde only one warning now it is no longer applicable. (This remained warning is not much important/useful anyway.) No regressions on {x86_64,x86_64-m32,i686}-fedora14snapshot-linux-gnu. OK to check-in? Thanks, Jan 2010-08-13 Jan Kratochvil * cli-logging.c: Include gdb_assert.h. (set_logging_overwrite): New function. (logging_redirect): New comment. (logging_no_redirect_file, set_logging_redirect) (pop_output_files) : New. (handle_redirections) : New variable no_redirect_file. Remove file autoclose for tee_file_new. No longer discard cleanup for the close of former OUTPUT. Set LOGGING_NO_REDIRECT_FILE. (handle_redirections) : gdb_assert LOGGING_NO_REDIRECT_FILE. (show_logging_command) : Adjust messages for SAVED_FILENAME not NULL. (_initialize_cli_logging): Install set_logging_overwrite and set_logging_redirect. --- a/gdb/cli/cli-logging.c +++ b/gdb/cli/cli-logging.c @@ -21,6 +21,7 @@ #include "defs.h" #include "gdbcmd.h" #include "ui-out.h" +#include "gdb_assert.h" #include "gdb_string.h" @@ -46,6 +47,15 @@ show_logging_filename (struct ui_file *file, int from_tty, } static int logging_overwrite; + +static void +set_logging_overwrite (char *args, int from_tty, struct cmd_list_element *c) +{ + if (saved_filename) + warning (_("Currently logging to %s. Turn the logging off and on to " + "make the new setting effective."), saved_filename); +} + static void show_logging_overwrite (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) @@ -55,7 +65,67 @@ Whether logging overwrites or appends to the log file is %s.\n"), value); } +/* Value as configured by the user. */ static int logging_redirect; + +/* The on-disk file in use if logging is currently active together with + redirection turned off (and therefore using tee_file_new). For active + logging with redirection the on-disk file is directly in GDB_STDOUT and + this variable is NULL. */ +static struct ui_file *logging_no_redirect_file; + +static void +set_logging_redirect (char *args, int from_tty, struct cmd_list_element *c) +{ + struct cleanup *cleanups = NULL; + struct ui_file *output, *new_logging_no_redirect_file; + + if (saved_filename == NULL + || (logging_redirect != 0 && logging_no_redirect_file == NULL) + || (logging_redirect == 0 && logging_no_redirect_file != NULL)) + return; + + if (logging_redirect != 0) + { + gdb_assert (logging_no_redirect_file != NULL); + + /* ui_out_redirect still has not been called for next gdb_stdout. */ + cleanups = make_cleanup_ui_file_delete (gdb_stdout); + + output = logging_no_redirect_file; + new_logging_no_redirect_file = NULL; + + if (from_tty) + fprintf_unfiltered (saved_output.out, "Redirecting output to %s.\n", + logging_filename); + } + else + { + gdb_assert (logging_no_redirect_file == NULL); + output = tee_file_new (saved_output.out, 0, gdb_stdout, 0); + if (output == NULL) + perror_with_name (_("set logging")); + new_logging_no_redirect_file = gdb_stdout; + + if (from_tty) + fprintf_unfiltered (saved_output.out, "Copying output to %s.\n", + logging_filename); + } + + gdb_stdout = output; + gdb_stderr = output; + gdb_stdlog = output; + gdb_stdtarg = output; + logging_no_redirect_file = new_logging_no_redirect_file; + + /* It should not happen, the redirection has been already setup. */ + if (ui_out_redirect (uiout, output) < 0) + warning (_("Current output protocol does not support redirection")); + + if (logging_redirect != 0) + do_cleanups (cleanups); +} + static void show_logging_redirect (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) @@ -70,6 +140,11 @@ pop_output_files (void) /* Only delete one of the files -- they are all set to the same value. */ ui_file_delete (gdb_stdout); + if (logging_no_redirect_file) + { + ui_file_delete (logging_no_redirect_file); + logging_no_redirect_file = NULL; + } gdb_stdout = saved_output.out; gdb_stderr = saved_output.err; gdb_stdlog = saved_output.log; @@ -104,18 +179,25 @@ handle_redirections (int from_tty) /* Redirects everything to gdb_stdout while this is running. */ if (!logging_redirect) { - output = tee_file_new (gdb_stdout, 0, output, 1); + struct ui_file *no_redirect_file = output; + + output = tee_file_new (gdb_stdout, 0, no_redirect_file, 0); if (output == NULL) perror_with_name (_("set logging")); - discard_cleanups (cleanups); - cleanups = make_cleanup_ui_file_delete (output); + make_cleanup_ui_file_delete (output); if (from_tty) fprintf_unfiltered (gdb_stdout, "Copying output to %s.\n", logging_filename); + logging_no_redirect_file = no_redirect_file; + } + else + { + gdb_assert (logging_no_redirect_file == NULL); + + if (from_tty) + fprintf_unfiltered (gdb_stdout, "Redirecting output to %s.\n", + logging_filename); } - else if (from_tty) - fprintf_unfiltered (gdb_stdout, "Redirecting output to %s.\n", - logging_filename); discard_cleanups (cleanups); @@ -187,10 +269,20 @@ show_logging_command (char *args, int from_tty) else printf_unfiltered (_("Logs will be appended to the log file.\n")); - if (logging_redirect) - printf_unfiltered (_("Output will be sent only to the log file.\n")); + if (saved_filename) + { + if (logging_redirect) + printf_unfiltered (_("Output is being sent only to the log file.\n")); + else + printf_unfiltered (_("Output is being logged and displayed.\n")); + } else - printf_unfiltered (_("Output will be logged and displayed.\n")); + { + if (logging_redirect) + printf_unfiltered (_("Output will be sent only to the log file.\n")); + else + printf_unfiltered (_("Output will be logged and displayed.\n")); + } } /* Provide a prototype to silence -Wmissing-prototypes. */ @@ -211,7 +303,7 @@ _initialize_cli_logging (void) Set whether logging overwrites or appends to the log file."), _("\ Show whether logging overwrites or appends to the log file."), _("\ If set, logging overrides the log file."), - NULL, + set_logging_overwrite, show_logging_overwrite, &set_logging_cmdlist, &show_logging_cmdlist); add_setshow_boolean_cmd ("redirect", class_support, &logging_redirect, _("\ @@ -219,7 +311,7 @@ Set the logging output mode."), _("\ Show the logging output mode."), _("\ If redirect is off, output will go to both the screen and the log file.\n\ If redirect is on, output will go only to the log file."), - NULL, + set_logging_redirect, show_logging_redirect, &set_logging_cmdlist, &show_logging_cmdlist); add_setshow_filename_cmd ("file", class_support, &logging_filename, _("\