Commit 1 of 2: be consistent in the MPI_*_F2C functions for the
handling of invalid Fortran handles. Per MPI-2:4.12.4, if we get an invalid Fortran handle, we should return an invalid C handle. Before this commit, we checked if the fortran handle index was out of range (i.e., <0 or >sizeof(array)). If so, we used to return MPI_*_NULL (i.e., a valid C handle). But to be faithful to MPI-2:4.12.4, we now return NULL (an invalid C handle). If the fortran index is in bounds but is an index for an MPI object that has already been freed, the code already returns NULL because the entry in the array will be NULL (i.e., we already did what MPI-2:4.12.4 said for this case). Hence, this commit makes the handling of invalid fortran handles in the MPI_*_F2C functions be uniform: we always return NULL. Commit 2 of this will be to edit just about every C interface function (!) to ensure that MPI handles are not NULL. Otherwise, if the user calls a fortran interface function with an invalid handle, the fortran interface function will call MPI_*_F2C and blindly pass the result to the back-end C function. The C function will eventually end up trying to dereference it -- segv. Having a run-time check for NULL and invoking an MPI exception is far more social (e.g., the user can get a stack trace out of MPI_ABORT) and consistent (i.e., we're already checking for MPI_*_NULL in the C interface functions). Since all the C interface functions have all the machinery for run-time parameter checking, and they all already check for MPI_*_NULL, it's easy enough to add another check for NULL. This commit was SVN r9560.
Этот коммит содержится в:
родитель
26d51d5041
Коммит
e00c6053dc
@ -9,6 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -41,11 +42,12 @@ MPI_Comm MPI_Comm_f2c(MPI_Fint comm)
|
||||
}
|
||||
|
||||
/* Per MPI-2:4.12.4, do not invoke an error handler if we get an
|
||||
invalid fortran handle */
|
||||
invalid fortran handle. If we get an invalid fortran handle,
|
||||
return an invalid C handle. */
|
||||
|
||||
if ( 0 > o_index ||
|
||||
o_index >= ompi_pointer_array_get_size(&ompi_mpi_communicators)) {
|
||||
return MPI_COMM_NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ompi_pointer_array_get_item(&ompi_mpi_communicators, o_index);
|
||||
|
@ -9,6 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -43,12 +44,13 @@ MPI_Errhandler MPI_Errhandler_f2c(MPI_Fint errhandler_f)
|
||||
}
|
||||
|
||||
/* Per MPI-2:4.12.4, do not invoke an error handler if we get an
|
||||
invalid fortran handle */
|
||||
|
||||
invalid fortran handle. If we get an invalid fortran handle,
|
||||
return an invalid C handle. */
|
||||
|
||||
if (eh_index < 0 ||
|
||||
eh_index >=
|
||||
ompi_pointer_array_get_size(ompi_errhandler_f_to_c_table)) {
|
||||
return MPI_ERRHANDLER_NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ompi_pointer_array_get_item(ompi_errhandler_f_to_c_table,
|
||||
|
@ -9,6 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -42,12 +43,13 @@ MPI_File MPI_File_f2c(MPI_Fint file_f)
|
||||
}
|
||||
|
||||
/* Per MPI-2:4.12.4, do not invoke an error handler if we get an
|
||||
invalid fortran handle */
|
||||
invalid fortran handle. If we get an invalid fortran handle,
|
||||
return an invalid C handle. */
|
||||
|
||||
if (file_index < 0 ||
|
||||
file_index >=
|
||||
ompi_pointer_array_get_size(&ompi_file_f_to_c_table)) {
|
||||
return MPI_FILE_NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ompi_pointer_array_get_item(&ompi_file_f_to_c_table, file_index);
|
||||
|
@ -9,6 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -42,12 +43,13 @@ MPI_Group MPI_Group_f2c(MPI_Fint group_f)
|
||||
}
|
||||
|
||||
/* Per MPI-2:4.12.4, do not invoke an error handler if we get an
|
||||
invalid fortran handle */
|
||||
invalid fortran handle. If we get an invalid fortran handle,
|
||||
return an invalid C handle. */
|
||||
|
||||
if (group_index < 0 ||
|
||||
group_index >=
|
||||
ompi_pointer_array_get_size(ompi_group_f_to_c_table)) {
|
||||
return MPI_GROUP_NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ompi_pointer_array_get_item(ompi_group_f_to_c_table, group_index);
|
||||
|
@ -9,6 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -50,12 +51,13 @@ MPI_Info MPI_Info_f2c(MPI_Fint info)
|
||||
}
|
||||
|
||||
/* Per MPI-2:4.12.4, do not invoke an error handler if we get an
|
||||
invalid fortran handle */
|
||||
invalid fortran handle. If we get an invalid fortran handle,
|
||||
return an invalid C handle. */
|
||||
|
||||
if (info_index < 0 ||
|
||||
info_index >=
|
||||
ompi_pointer_array_get_size(&ompi_info_f_to_c_table)) {
|
||||
return MPI_INFO_NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ompi_pointer_array_get_item(&ompi_info_f_to_c_table, info_index);
|
||||
|
@ -9,6 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -43,12 +44,13 @@ MPI_Op MPI_Op_f2c(MPI_Fint op_f)
|
||||
}
|
||||
|
||||
/* Per MPI-2:4.12.4, do not invoke an error handler if we get an
|
||||
invalid fortran handle */
|
||||
invalid fortran handle. If we get an invalid fortran handle,
|
||||
return an invalid C handle. */
|
||||
|
||||
if (op_index < 0 ||
|
||||
op_index >=
|
||||
ompi_pointer_array_get_size(ompi_op_f_to_c_table)) {
|
||||
return MPI_OP_NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ompi_pointer_array_get_item(ompi_op_f_to_c_table, op_index);
|
||||
|
@ -9,6 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -41,12 +42,13 @@ MPI_Request MPI_Request_f2c(MPI_Fint request)
|
||||
}
|
||||
|
||||
/* Per MPI-2:4.12.4, do not invoke an error handler if we get an
|
||||
invalid fortran handle */
|
||||
invalid fortran handle. If we get an invalid fortran handle,
|
||||
return an invalid C handle. */
|
||||
|
||||
if (request_index < 0 ||
|
||||
request_index >=
|
||||
ompi_pointer_array_get_size(&ompi_request_f_to_c_table)) {
|
||||
return MPI_REQUEST_NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ompi_pointer_array_get_item(&ompi_request_f_to_c_table,
|
||||
|
@ -9,6 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -41,12 +42,13 @@ MPI_Datatype MPI_Type_f2c(MPI_Fint datatype)
|
||||
}
|
||||
|
||||
/* Per MPI-2:4.12.4, do not invoke an error handler if we get an
|
||||
invalid fortran handle */
|
||||
invalid fortran handle. If we get an invalid fortran handle,
|
||||
return an invalid C handle. */
|
||||
|
||||
if (datatype_index < 0 ||
|
||||
datatype_index >=
|
||||
ompi_pointer_array_get_size(ompi_datatype_f_to_c_table)) {
|
||||
return MPI_DATATYPE_NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ompi_pointer_array_get_item(ompi_datatype_f_to_c_table, datatype);
|
||||
|
@ -9,6 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -41,11 +42,12 @@ MPI_Win MPI_Win_f2c(MPI_Fint win)
|
||||
}
|
||||
|
||||
/* Per MPI-2:4.12.4, do not invoke an error handler if we get an
|
||||
invalid fortran handle */
|
||||
invalid fortran handle. If we get an invalid fortran handle,
|
||||
return an invalid C handle. */
|
||||
|
||||
if ( 0 > o_index ||
|
||||
o_index >= ompi_pointer_array_get_size(&ompi_mpi_windows)) {
|
||||
return MPI_WIN_NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ompi_pointer_array_get_item(&ompi_mpi_windows, o_index);
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user