This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

[gcj] Some memory leak cleanups


Hi,

While investigating bug #19325 by using valgrind I found some simple
memory leaks. This patch fixes those:

2005-01-08  Mark Wielaard  <mark@klomp.org>

        * parse.y (process_imports): Allocate (and free) original_name only
        when not already defined.
        * jcf-parse.c (read_class): Free results of find_class() and
        lrealpath().
        (java_parse_file): Keep pointer to head of file_list and free when
        done. Free result of lrealpath().

It certainly doesn't solve the above bug. But when running gcj on a
couple of hunderd (or thousand in the case of GNU Classpath) source
files it certainly has an impact on the memory usage.

OK to commit?

Cheers,

Mark
? mem.patch
Index: jcf-parse.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jcf-parse.c,v
retrieving revision 1.181
diff -u -r1.181 jcf-parse.c
--- jcf-parse.c	8 Dec 2004 14:01:50 -0000	1.181
+++ jcf-parse.c	8 Jan 2005 15:31:11 -0000
@@ -530,11 +530,17 @@
 
   if (jcf == NULL)
     {
+      const char* path_name;
       this_jcf.zipd = NULL;
       jcf = &this_jcf;
-      if (find_class (IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name),
-		      &this_jcf, 1) == 0)
+      
+      path_name = find_class (IDENTIFIER_POINTER (name),
+			      IDENTIFIER_LENGTH (name),
+			      &this_jcf, 1);
+      if (path_name == 0)
 	return 0;
+      else
+	free((char *) path_name);
     }
 
   current_jcf = jcf;
@@ -542,6 +548,7 @@
   if (current_jcf->java_source)
     {
       const char *filename = current_jcf->filename;
+      char *real_path;
       tree given_file, real_file;
       FILE *finput;
       int generate;
@@ -551,7 +558,9 @@
 
       given_file = get_identifier (filename);
       filename = IDENTIFIER_POINTER (given_file);
-      real_file = get_identifier (lrealpath (filename));
+      real_path = lrealpath (filename);
+      real_file = get_identifier (real_path);
+      free (real_path);
 
       generate = IS_A_COMMAND_LINE_FILENAME_P (given_file);
       output_class = current_class = NULL_TREE;
@@ -1025,7 +1034,7 @@
 {
   int filename_count = 0;
   location_t save_location = input_location;
-  char *list, *next;
+  char *file_list = NULL, *list, *next;
   tree node;
   FILE *finput = NULL;
   int in_quotes = 0;
@@ -1063,6 +1072,7 @@
 	}
       fclose (finput);
       finput = NULL;
+      file_list = list;
     }
   else
     list = (char *) main_input_filename;
@@ -1138,6 +1148,9 @@
       list = next;
     }
 
+  if (file_list != NULL)
+    free (file_list);
+
   if (filename_count == 0)
     warning ("no input file specified");
 
@@ -1159,13 +1172,16 @@
   for (node = current_file_list; node; node = TREE_CHAIN (node))
     {
       unsigned char magic_string[4];
+      char *real_path;
       uint32 magic = 0;
       tree name = DECL_NAME (node);
       tree real_file;
       const char *filename = IDENTIFIER_POINTER (name);
 
       /* Skip already parsed files */
-      real_file = get_identifier (lrealpath (filename));
+      real_path = lrealpath (filename);
+      real_file = get_identifier (real_path);
+      free (real_path);
       if (HAS_BEEN_ALREADY_PARSED_P (real_file))
 	continue;
 
Index: parse.y
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/parse.y,v
retrieving revision 1.525
diff -u -r1.525 parse.y
--- parse.y	6 Dec 2004 15:32:37 -0000	1.525
+++ parse.y	8 Jan 2005 15:31:13 -0000
@@ -6955,14 +6955,14 @@
       tree to_be_found = EXPR_WFL_NODE (TREE_PURPOSE (import));
       char *original_name;
 
-      original_name = xmemdup (IDENTIFIER_POINTER (to_be_found),
-			       IDENTIFIER_LENGTH (to_be_found),
-			       IDENTIFIER_LENGTH (to_be_found) + 1);
-
       /* Don't load twice something already defined. */
       if (IDENTIFIER_CLASS_VALUE (to_be_found))
 	continue;
 
+      original_name = xmemdup (IDENTIFIER_POINTER (to_be_found),
+			       IDENTIFIER_LENGTH (to_be_found),
+			       IDENTIFIER_LENGTH (to_be_found) + 1);
+
       while (1)
 	{
 	  tree left;

Attachment: signature.asc
Description: This is a digitally signed message part


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