[mpich2-commits] r5624 - mpich2/trunk/src/mpi/errhan

goodell at mcs.anl.gov goodell at mcs.anl.gov
Thu Oct 29 16:56:59 CDT 2009


Author: goodell
Date: 2009-10-29 16:56:59 -0500 (Thu, 29 Oct 2009)
New Revision: 5624

Modified:
   mpich2/trunk/src/mpi/errhan/file_set_errhandler.c
Log:
Fix MPI_File errhandler leak.

Prior to this commit we only released references to the previously set file
errhandler in MPI_File_set_errhandler if the newly set errhandler was *not*
builtin.  This resulted in an errhandler object leak if a user-defined
errhandler was set and then a predefined errhandler was set afterwards.

Reviewed by robl at .

Modified: mpich2/trunk/src/mpi/errhan/file_set_errhandler.c
===================================================================
--- mpich2/trunk/src/mpi/errhan/file_set_errhandler.c	2009-10-29 21:56:57 UTC (rev 5623)
+++ mpich2/trunk/src/mpi/errhan/file_set_errhandler.c	2009-10-29 21:56:59 UTC (rev 5624)
@@ -103,21 +103,22 @@
 #   endif /* HAVE_ERROR_CHECKING */
 
     /* ... body of routine ...  */
-    if (HANDLE_GET_KIND(errhandler) != HANDLE_KIND_BUILTIN) {
-	MPIR_ROMIO_Get_file_errhand( file, &old_errhandler );
-	if (!old_errhandler) {
-	    MPID_Errhandler_get_ptr( MPI_ERRORS_RETURN, old_errhandler_ptr );
-	}
-	else {
-	    MPID_Errhandler_get_ptr( old_errhandler, old_errhandler_ptr );
-	}
+    MPIR_ROMIO_Get_file_errhand( file, &old_errhandler );
+    if (!old_errhandler) {
+        /* MPI_File objects default to the errhandler set on MPI_FILE_NULL
+         * at file open time, or MPI_ERRORS_RETURN if no errhandler is set
+         * on MPI_FILE_NULL. (MPI-2.2, sec 13.7) */
+        MPID_Errhandler_get_ptr( MPI_ERRORS_RETURN, old_errhandler_ptr );
+    }
+    else {
+        MPID_Errhandler_get_ptr( old_errhandler, old_errhandler_ptr );
+    }
 
-	if (old_errhandler_ptr) {
-	    MPIR_Errhandler_release_ref(old_errhandler_ptr,&in_use);
-	    if (!in_use) {
-		MPID_Errhandler_free( old_errhandler_ptr );
-	    }
-	}
+    if (old_errhandler_ptr) {
+        MPIR_Errhandler_release_ref(old_errhandler_ptr,&in_use);
+        if (!in_use) {
+            MPID_Errhandler_free( old_errhandler_ptr );
+        }
     }
 
     MPIR_Errhandler_add_ref(errhan_ptr);
@@ -129,7 +130,7 @@
     if (0) goto fn_fail; /* quiet compiler warning about unused label */
 #endif
 #endif
-    
+
     /* ... end of body of routine ... */
 
 #ifdef HAVE_ERROR_CHECKING



More information about the mpich2-commits mailing list