Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom Tromey <tromey@redhat.com>
To: Pedro Alves <pedro@codesourcery.com>
Cc: gdb-patches@sourceware.org
Subject: Re: RFA: cleanups -vs- gdb_fopen
Date: Thu, 30 Oct 2008 21:52:00 -0000	[thread overview]
Message-ID: <m3wsfpj0k1.fsf@fleche.redhat.com> (raw)
In-Reply-To: <200810291645.56749.pedro@codesourcery.com> (Pedro Alves's message of "Wed\, 29 Oct 2008 16\:45\:56 +0000")

>>>>> "Pedro" == Pedro Alves <pedro@codesourcery.com> writes:

Pedro> This one had me scratch my head a bit:
[...]

Pedro> If an error is thrown after tee_file_new returning a valid file (it
Pedro> always does currently), you'd run the cleanup on the old `output',
Pedro> and leave the new `output' leaking.  That can't happen with the current
Pedro> code, so, your patch looks good to me.

Oops, I missed that.

I think it is nice to try to be safe about this sort of thing.  That
way people don't have to think too hard when making changes between
opening a file and closing it.

What do you think of this variant, which fixes the cleanup after
tee_file_new?

Tom

2008-10-28  Tom Tromey  <tromey@redhat.com>

	* cli/cli-logging.c (handle_redirections): Make a cleanup.
	* reggroups.c (maintenance_print_reggroups): Make a cleanup.
	* regcache.c (regcache_print): Make a cleanup.
	* maint.c (maintenance_print_architecture): Make a cleanup.
	* dummy-frame.c (maintenance_print_dummy_frames): Make a cleanup.

diff --git a/gdb/cli/cli-logging.c b/gdb/cli/cli-logging.c
index 86f1bc0..1e941b1 100644
--- a/gdb/cli/cli-logging.c
+++ b/gdb/cli/cli-logging.c
@@ -85,6 +85,7 @@ pop_output_files (void)
 static void
 handle_redirections (int from_tty)
 {
+  struct cleanup *cleanups;
   struct ui_file *output;
 
   if (saved_filename != NULL)
@@ -97,6 +98,7 @@ handle_redirections (int from_tty)
   output = gdb_fopen (logging_filename, logging_overwrite ? "w" : "a");
   if (output == NULL)
     perror_with_name (_("set logging"));
+  cleanups = make_cleanup_ui_file_delete (output);
 
   /* Redirects everything to gdb_stdout while this is running.  */
   if (!logging_redirect)
@@ -104,6 +106,8 @@ handle_redirections (int from_tty)
       output = tee_file_new (gdb_stdout, 0, output, 1);
       if (output == NULL)
 	perror_with_name (_("set logging"));
+      discard_cleanups (cleanups);
+      cleanups = make_cleanup_ui_file_delete (output);
       if (from_tty)
 	fprintf_unfiltered (gdb_stdout, "Copying output to %s.\n",
 			    logging_filename);
@@ -112,6 +116,8 @@ handle_redirections (int from_tty)
     fprintf_unfiltered (gdb_stdout, "Redirecting output to %s.\n",
 			logging_filename);
 
+  discard_cleanups (cleanups);
+
   saved_filename = xstrdup (logging_filename);
   saved_output.out = gdb_stdout;
   saved_output.err = gdb_stderr;
diff --git a/gdb/dummy-frame.c b/gdb/dummy-frame.c
index a27de2e..9cc3da7 100644
--- a/gdb/dummy-frame.c
+++ b/gdb/dummy-frame.c
@@ -265,11 +265,13 @@ maintenance_print_dummy_frames (char *args, int from_tty)
     fprint_dummy_frames (gdb_stdout);
   else
     {
+      struct cleanup *cleanups;
       struct ui_file *file = gdb_fopen (args, "w");
       if (file == NULL)
 	perror_with_name (_("maintenance print dummy-frames"));
+      cleanups = make_cleanup_ui_file_delete (file);
       fprint_dummy_frames (file);    
-      ui_file_delete (file);
+      do_cleanups (cleanups);
     }
 }
 
diff --git a/gdb/maint.c b/gdb/maint.c
index e64d4fe..365e374 100644
--- a/gdb/maint.c
+++ b/gdb/maint.c
@@ -414,11 +414,13 @@ maintenance_print_architecture (char *args, int from_tty)
     gdbarch_dump (current_gdbarch, gdb_stdout);
   else
     {
+      struct cleanup *cleanups;
       struct ui_file *file = gdb_fopen (args, "w");
       if (file == NULL)
 	perror_with_name (_("maintenance print architecture"));
+      cleanups = make_cleanup_ui_file_delete (file);
       gdbarch_dump (current_gdbarch, file);    
-      ui_file_delete (file);
+      do_cleanups (cleanups);
     }
 }
 
diff --git a/gdb/regcache.c b/gdb/regcache.c
index 616a6f7..74ca6f0 100644
--- a/gdb/regcache.c
+++ b/gdb/regcache.c
@@ -1104,11 +1104,13 @@ regcache_print (char *args, enum regcache_dump_what what_to_dump)
     regcache_dump (get_current_regcache (), gdb_stdout, what_to_dump);
   else
     {
+      struct cleanup *cleanups;
       struct ui_file *file = gdb_fopen (args, "w");
       if (file == NULL)
 	perror_with_name (_("maintenance print architecture"));
+      cleanups = make_cleanup_ui_file_delete (file);
       regcache_dump (get_current_regcache (), file, what_to_dump);
-      ui_file_delete (file);
+      do_cleanups (cleanups);
     }
 }
 
diff --git a/gdb/reggroups.c b/gdb/reggroups.c
index ea2451e..a4e1d31 100644
--- a/gdb/reggroups.c
+++ b/gdb/reggroups.c
@@ -234,11 +234,13 @@ maintenance_print_reggroups (char *args, int from_tty)
     reggroups_dump (current_gdbarch, gdb_stdout);
   else
     {
+      struct cleanup *cleanups;
       struct ui_file *file = gdb_fopen (args, "w");
       if (file == NULL)
 	perror_with_name (_("maintenance print reggroups"));
+      cleanups = make_cleanup_ui_file_delete (file);
       reggroups_dump (current_gdbarch, file);    
-      ui_file_delete (file);
+      do_cleanups (cleanups);
     }
 }
 


  reply	other threads:[~2008-10-30 21:50 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-10-28 18:43 Tom Tromey
2008-10-29 17:39 ` Pedro Alves
2008-10-30 21:52   ` Tom Tromey [this message]
2008-10-30 21:35     ` Pedro Alves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m3wsfpj0k1.fsf@fleche.redhat.com \
    --to=tromey@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=pedro@codesourcery.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox