[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