1
1

coll/base: fix error reporting

and silence CID 1271639
Этот коммит содержится в:
Gilles Gouaillardet 2015-02-27 17:04:26 +09:00
родитель 455b465329
Коммит ce2020d255

Просмотреть файл

@ -9,7 +9,7 @@
* University of Stuttgart. All rights reserved. * University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California. * Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved. * All rights reserved.
* Copyright (c) 2014 Research Organization for Information Science * Copyright (c) 2014-2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved. * and Technology (RIST). All rights reserved.
* $COPYRIGHT$ * $COPYRIGHT$
* *
@ -64,6 +64,24 @@ int ompi_coll_base_sendrecv_nonzero_actual( void* sendbuf, size_t scount,
if (0 != nreqs) { if (0 != nreqs) {
err = ompi_request_wait_all( nreqs, reqs, statuses ); err = ompi_request_wait_all( nreqs, reqs, statuses );
if( MPI_ERR_IN_STATUS == err ) {
/* As we use wait_all we will get MPI_ERR_IN_STATUS which is not an error
* code that we can propagate up the stack. Instead, look for the real
* error code from the MPI_ERROR in the status.
*/
int err_index = 0;
if( MPI_SUCCESS == statuses[0].MPI_ERROR ) {
err_index = 1;
}
if (MPI_STATUS_IGNORE != status) {
*status = statuses[err_index];
}
err = statuses[err_index].MPI_ERROR;
OPAL_OUTPUT ((ompi_coll_base_framework.framework_output, "%s:%d: Error %d occurred in the %s"
" stage of ompi_coll_base_sendrecv_zero\n",
__FILE__, line, err, (0 == err_index ? "receive" : "send")));
return err;
}
if (err != MPI_SUCCESS) { line = __LINE__; goto error_handler; } if (err != MPI_SUCCESS) { line = __LINE__; goto error_handler; }
if (MPI_STATUS_IGNORE != status) { if (MPI_STATUS_IGNORE != status) {
@ -77,32 +95,13 @@ int ompi_coll_base_sendrecv_nonzero_actual( void* sendbuf, size_t scount,
return (MPI_SUCCESS); return (MPI_SUCCESS);
error_handler: error_handler:
/* As we use wait_all we will get MPI_ERR_IN_STATUS which is not an error /* Error discovered during the posting of the irecv or isend,
* code that we can propagate up the stack. Instead, look for the real * and no status is available.
* error code from the MPI_ERROR in the status.
*/ */
if( MPI_ERR_IN_STATUS == err ) { OPAL_OUTPUT ((ompi_coll_base_framework.framework_output, "%s:%d: Error %d occurred\n",
/* At least we know the error was detected during the wait_all */ __FILE__, line, err));
int err_index = 1; if (MPI_STATUS_IGNORE != status) {
if( MPI_SUCCESS == statuses[0].MPI_ERROR ) { status->MPI_ERROR = err;
err_index = 0;
}
if (MPI_STATUS_IGNORE != status) {
*status = statuses[err_index];
}
err = statuses[err_index].MPI_ERROR;
OPAL_OUTPUT ((ompi_coll_base_framework.framework_output, "%s:%d: Error %d occurred in the %s"
" stage of ompi_coll_base_sendrecv_zero\n",
__FILE__, line, err, (0 == err_index ? "receive" : "send")));
} else {
/* Error discovered during the posting of the irecv or isend,
* and no status is available.
*/
OPAL_OUTPUT ((ompi_coll_base_framework.framework_output, "%s:%d: Error %d occurred\n",
__FILE__, line, err));
if (MPI_STATUS_IGNORE != status) {
status->MPI_ERROR = err;
}
} }
return (err); return (err);
} }