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