[mpich2-commits] r4029 - in mpich2/trunk/src: include mpi/attr

goodell at mcs.anl.gov goodell at mcs.anl.gov
Thu Mar 12 12:43:02 CDT 2009


Author: goodell
Date: 2009-03-12 12:43:01 -0500 (Thu, 12 Mar 2009)
New Revision: 4029

Modified:
   mpich2/trunk/src/include/mpiimpl.h
   mpich2/trunk/src/mpi/attr/comm_create_keyval.c
   mpich2/trunk/src/mpi/attr/comm_free_keyval.c
   mpich2/trunk/src/mpi/attr/type_create_keyval.c
   mpich2/trunk/src/mpi/attr/type_free_keyval.c
   mpich2/trunk/src/mpi/attr/win_create_keyval.c
   mpich2/trunk/src/mpi/attr/win_free_keyval.c
Log:
Fix a double-free bug with attribute keyvals.

This is partly a fix for tickets #222 and #449, although both
of those still need work from RobL.

Reviewed by robl at .

Modified: mpich2/trunk/src/include/mpiimpl.h
===================================================================
--- mpich2/trunk/src/include/mpiimpl.h	2009-03-12 17:42:59 UTC (rev 4028)
+++ mpich2/trunk/src/include/mpiimpl.h	2009-03-12 17:43:01 UTC (rev 4029)
@@ -1033,6 +1033,7 @@
     int                  handle;
     volatile int         ref_count;
     MPID_Object_kind     kind;
+    int                  was_freed;
     void                 *extra_state;
     MPID_Copy_function   copyfn;
     MPID_Delete_function delfn;

Modified: mpich2/trunk/src/mpi/attr/comm_create_keyval.c
===================================================================
--- mpich2/trunk/src/mpi/attr/comm_create_keyval.c	2009-03-12 17:42:59 UTC (rev 4028)
+++ mpich2/trunk/src/mpi/attr/comm_create_keyval.c	2009-03-12 17:43:01 UTC (rev 4029)
@@ -108,6 +108,7 @@
 	(MPID_COMM << 22);
     *comm_keyval		 = keyval_ptr->handle;
     MPIU_Object_set_ref(keyval_ptr,1);
+    keyval_ptr->was_freed        = 0;
     keyval_ptr->kind	         = MPID_COMM;
     keyval_ptr->extra_state      = extra_state;
     keyval_ptr->copyfn.user_function = comm_copy_attr_fn;

Modified: mpich2/trunk/src/mpi/attr/comm_free_keyval.c
===================================================================
--- mpich2/trunk/src/mpi/attr/comm_free_keyval.c	2009-03-12 17:42:59 UTC (rev 4028)
+++ mpich2/trunk/src/mpi/attr/comm_free_keyval.c	2009-03-12 17:43:01 UTC (rev 4029)
@@ -95,9 +95,12 @@
 
     /* ... body of routine ...  */
     
-    MPIR_Keyval_release_ref( keyval_ptr, &in_use);
-    if (!in_use) {
-	MPIU_Handle_obj_free( &MPID_Keyval_mem, keyval_ptr );
+    if (!keyval_ptr->was_freed) {
+        keyval_ptr->was_freed = 1;
+        MPIR_Keyval_release_ref( keyval_ptr, &in_use);
+        if (!in_use) {
+            MPIU_Handle_obj_free( &MPID_Keyval_mem, keyval_ptr );
+        }
     }
     *comm_keyval = MPI_KEYVAL_INVALID;
 

Modified: mpich2/trunk/src/mpi/attr/type_create_keyval.c
===================================================================
--- mpich2/trunk/src/mpi/attr/type_create_keyval.c	2009-03-12 17:42:59 UTC (rev 4028)
+++ mpich2/trunk/src/mpi/attr/type_create_keyval.c	2009-03-12 17:43:01 UTC (rev 4029)
@@ -100,6 +100,7 @@
 	(MPID_DATATYPE << 22);
     *type_keyval		 = keyval_ptr->handle;
     MPIU_Object_set_ref(keyval_ptr,1);
+    keyval_ptr->was_freed        = 0;
     keyval_ptr->kind	         = MPID_DATATYPE;
     keyval_ptr->extra_state      = extra_state;
     keyval_ptr->copyfn.user_function = type_copy_attr_fn;

Modified: mpich2/trunk/src/mpi/attr/type_free_keyval.c
===================================================================
--- mpich2/trunk/src/mpi/attr/type_free_keyval.c	2009-03-12 17:42:59 UTC (rev 4028)
+++ mpich2/trunk/src/mpi/attr/type_free_keyval.c	2009-03-12 17:43:01 UTC (rev 4029)
@@ -92,9 +92,12 @@
 
     /* ... body of routine ...  */
     
-    MPIR_Keyval_release_ref( keyval_ptr, &in_use);
-    if (!in_use) {
-	MPIU_Handle_obj_free( &MPID_Keyval_mem, keyval_ptr );
+    if (!keyval_ptr->was_freed) {
+        keyval_ptr->was_freed = 1;
+        MPIR_Keyval_release_ref( keyval_ptr, &in_use);
+        if (!in_use) {
+            MPIU_Handle_obj_free( &MPID_Keyval_mem, keyval_ptr );
+        }
     }
     *type_keyval = MPI_KEYVAL_INVALID;
 

Modified: mpich2/trunk/src/mpi/attr/win_create_keyval.c
===================================================================
--- mpich2/trunk/src/mpi/attr/win_create_keyval.c	2009-03-12 17:42:59 UTC (rev 4028)
+++ mpich2/trunk/src/mpi/attr/win_create_keyval.c	2009-03-12 17:43:01 UTC (rev 4029)
@@ -100,6 +100,7 @@
 	(MPID_WIN << 22);
     *win_keyval		         = keyval_ptr->handle;
     MPIU_Object_set_ref(keyval_ptr,1);
+    keyval_ptr->was_freed        = 0;
     keyval_ptr->kind	         = MPID_WIN;
     keyval_ptr->extra_state      = extra_state;
     keyval_ptr->copyfn.user_function = win_copy_attr_fn;

Modified: mpich2/trunk/src/mpi/attr/win_free_keyval.c
===================================================================
--- mpich2/trunk/src/mpi/attr/win_free_keyval.c	2009-03-12 17:42:59 UTC (rev 4028)
+++ mpich2/trunk/src/mpi/attr/win_free_keyval.c	2009-03-12 17:43:01 UTC (rev 4029)
@@ -92,9 +92,12 @@
 
     /* ... body of routine ...  */
     
-    MPIR_Keyval_release_ref( keyval_ptr, &in_use);
-    if (!in_use) {
-	MPIU_Handle_obj_free( &MPID_Keyval_mem, keyval_ptr );
+    if (!keyval_ptr->was_freed) {
+        keyval_ptr->was_freed = 1;
+        MPIR_Keyval_release_ref( keyval_ptr, &in_use);
+        if (!in_use) {
+            MPIU_Handle_obj_free( &MPID_Keyval_mem, keyval_ptr );
+        }
     }
     *win_keyval = MPI_KEYVAL_INVALID;
 



More information about the mpich2-commits mailing list