Hi Ravi, This fix looks good to me. Please go ahead with the commit.
-David Coakley / AMD Open Source Compiler Engineering On Wed, Mar 2, 2011 at 8:33 AM, D, Ravi <rav...@amd.com> wrote: > Hello all, > > > > Gatekeeper could you please review the fix for bug ID 737. > > > > http://bugs.open64.net/show_bug.cgi?id=737 > > > > Please check the attached patch., details as follows > > > > Observation > > > > · When multiple source files was provided in command line, open64 > was not able to complete the compilation successfully. > > > > Problem > > The problem was, the temp files created using “mkstemp” was > not closed. > > > > As per the current implementation, we are only performing > unlink on the temp_files, in the cleanup() function. > > > > --cut— > > unlink() deletes a name from the filesystem. If that name was the last link > to a file and no processes have the file open the file is deleted and the > space it was using is made available for reuse. > > If the name was the last link to a file but any processes still have the > file open the file will remain in existence until the last file descriptor > referring to it is closed. > > --cut-- > > Since we are not closing the opened temp files, unlink will not be able to > delete the temp files created. > > > > Fix: > > · The file descriptor (FD) of the temp files opened has to be > collected, so that in cleanup() function, we can close the opened files > before unlinking. > > > > Implementation > > The existing “temp_files” list is of type string_list_t, which has been > mostly used for string related operations. > > > > So changed the “temp_files” type to file_list_t (new data > structure) and all the necessary changes to perform cleanup has been made. > > > > Thank you, > > --Ravi > > > > > > Index: osprey/driver/file_names.c > > =================================================================== > > --- osprey/driver/file_names.c > > +++ osprey/driver/file_names.c (working copy) > > @@ -1,4 +1,8 @@ > > /* > > + * Copyright (C) 2011 Advanced Micro Devices, Inc. All Rights Reserved. > > + */ > > + > > +/* > > * Copyright (C) 2006, 2007. QLogic Corporation. All Rights Reserved. > > */ > > > > @@ -70,8 +74,15 @@ > > > > boolean keep_flag = FALSE; > > > > +/* linked list of files */ > > +typedef struct file_item_rec { > > + char *name; > > + int file_descriptor; > > + struct file_item_rec *next; > > +} file_item_t; > > + > > string_list_t *count_files = NULL; > > -static string_list_t *temp_files = NULL; > > +static file_item_t *temp_files = NULL; > > #ifdef KEY /* Bug 11265 */ > > string_list_t *isystem_dirs = NULL; > > #endif /* KEY Bug 11265 */ > > @@ -122,7 +133,39 @@ > > > > static string_pair_list_t *temp_obj_files = NULL; > > > > +/* add file that has already been opened */ > > +static void > > +add_temp_file_info (char *s, int fd) > > +{ > > + file_item_t *p; > > + p = (file_item_t *) malloc(sizeof(file_item_t)); > > + p->next = NULL; > > + if (temp_files == NULL) { > > + temp_files = p; > > + } else { > > + p->next = temp_files; > > + temp_files = p; > > + } > > + p->name = s; > > + p->file_descriptor = fd; > > > > +} > > + > > +/* add file to list if not already in list */ > > +static void > > +add_file_if_new (char *s, int fd) > > +{ > > + file_item_t *p; > > + char *str; > > + for (p = temp_files; p != NULL; p = p->next) { > > + if (strcmp(p->name, s) == 0) > > + return; /* already in list */ > > + } > > + str = string_copy(s); > > + /* string not in list */ > > + add_temp_file_info(str, fd); > > +} > > + > > /* get object file corresponding to src file */ > > char * > > get_object_file (char *src) > > @@ -182,8 +225,8 @@ > > buffer_t pathbuf; > > size_t prefix_len; > > char *s; > > - string_item_t *p; > > - int fd; > > + file_item_t *p; > > + int fd = -1; > > /* use same prefix as gcc compilers */ > > /* use mkstemp instead of tempnam to be more portable */ > > sprintf(buf, "cc%s#.XXXXXX", suffix); > > @@ -196,7 +239,7 @@ > > /* subtracting the XXXXXX */ > > prefix_len = strlen(pathbuf) - strlen(strchr(pathbuf, '#')); > > > > - for (p = temp_files->head; p != NULL; p = p->next) { > > + for (p = temp_files; p != NULL; p = p->next) { > > if (strncmp(p->name, pathbuf, prefix_len) == 0) { > > /* matches the prefix and suffix character */ > > return p->name; > > @@ -215,7 +258,7 @@ > > fd = mkstemp(pathbuf); > > s = string_copy(pathbuf); > > #endif > > - add_string (temp_files, s); > > + add_temp_file_info(s, fd); > > return s; > > } > > > > @@ -249,7 +292,7 @@ > > return s; > > } else { > > s = string_copy(s); > > - add_string_if_new (temp_files, s); > > + add_file_if_new(s, -1); > > return s; > > } > > } > > @@ -258,7 +301,7 @@ > > mark_saved_object_for_cleanup ( void ) > > { > > if (saved_object != NULL) > > - add_string_if_new (temp_files, saved_object); > > + add_file_if_new(saved_object, -1); > > } > > > > /* Create filename with the given extension; eg. foo.anl from foo.f */ > > @@ -300,7 +343,7 @@ > > /* drop / at end so strcmp matches */ > > tmpdir[strlen(tmpdir)-1] = '\0'; > > } > > - temp_files = init_string_list(); > > + temp_files = NULL; > > > > temp_obj_files = init_string_pair_list(); > > } > > @@ -329,7 +372,7 @@ > > report_file = NULL; > > goto bail; > > } > > - > > + > > if (mkstemp(report_file) == -1) { > > report_file = NULL; > > goto bail; > > @@ -523,11 +566,14 @@ > > cleanup (void) > > { > > /* cleanup temp-files */ > > - string_item_t *p; > > + file_item_t *p; > > int status; > > if (temp_files == NULL) return; > > - for (p = temp_files->head; p != NULL; p = p->next) { > > + for (p = temp_files; p != NULL; p = p->next) { > > if (debug) printf("unlink %s\n", p->name); > > + if (p->file_descriptor > 0){ > > + close(p->file_descriptor); > > + } > > /* when using mkstemp, files are always > created */ > > /* if (execute_flag) { */ > > if (internal_error_occurred) > > @@ -547,7 +593,13 @@ > > > perror(program_name); > > } > > } > > - temp_files->head = temp_files->tail = NULL; > > + p = temp_files; > > + while (p != NULL) { > > + file_item_t *p_next = p->next; > > + free(p); > > + p = p_next; > > + } > > + temp_files = NULL; > > > > if (save_count) { > > fprintf(stderr, "Please review the above > file%s and, " > > @@ -560,7 +612,7 @@ > > void > > mark_for_cleanup (char *s) > > { > > - add_string_if_new (temp_files, s); > > + add_file_if_new(s, -1); > > } > > > > void > > ------------------------------------------------------------------------------ > Free Software Download: Index, Search & Analyze Logs and other IT data in > Real-Time with Splunk. Collect, index and harness all the fast moving IT > data > generated by your applications, servers and devices whether physical, > virtual > or in the cloud. Deliver compliance at lower cost and gain new business > insights. http://p.sf.net/sfu/splunk-dev2dev > _______________________________________________ > Open64-devel mailing list > Open64-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/open64-devel > > ------------------------------------------------------------------------------ Colocation vs. Managed Hosting A question and answer guide to determining the best fit for your organization - today and in the future. http://p.sf.net/sfu/internap-sfd2d _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel