0324fdb407
status structure or the _ucount field in the status structure. On 64-bit sparc, the macros resolve into integer array assignments. For all others, they are just simple assignments. This fixes possible BUS errors seen when running on the SPARC processor. This bug was introduced when the _count field changed from an int into a size_t. See the changes to request.h for additional details. This commit fixes trac:2514. This commit was SVN r23554. The following Trac tickets were found above: Ticket 2514 --> https://svn.open-mpi.org/trac/ompi/ticket/2514
101 строка
3.2 KiB
C
101 строка
3.2 KiB
C
/*
|
|
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
|
* University Research and Technology
|
|
* Corporation. All rights reserved.
|
|
* Copyright (c) 2004-2005 The University of Tennessee and The University
|
|
* of Tennessee Research Foundation. All rights
|
|
* reserved.
|
|
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
|
* University of Stuttgart. All rights reserved.
|
|
* Copyright (c) 2004-2006 The Regents of the University of California.
|
|
* All rights reserved.
|
|
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
#include "ompi_config.h"
|
|
#include "ompi/request/request.h"
|
|
#include "pml_dr_recvreq.h"
|
|
|
|
|
|
int mca_pml_dr_irecv_init(void *addr,
|
|
size_t count,
|
|
ompi_datatype_t * datatype,
|
|
int src,
|
|
int tag,
|
|
struct ompi_communicator_t *comm,
|
|
struct ompi_request_t **request)
|
|
{
|
|
int rc;
|
|
mca_pml_dr_recv_request_t *recvreq;
|
|
MCA_PML_DR_RECV_REQUEST_ALLOC(recvreq, rc);
|
|
if (NULL == recvreq)
|
|
return rc;
|
|
|
|
MCA_PML_DR_RECV_REQUEST_INIT(recvreq,
|
|
addr,
|
|
count, datatype, src, tag, comm, true);
|
|
|
|
*request = (ompi_request_t *) recvreq;
|
|
return OMPI_SUCCESS;
|
|
}
|
|
|
|
int mca_pml_dr_irecv(void *addr,
|
|
size_t count,
|
|
ompi_datatype_t * datatype,
|
|
int src,
|
|
int tag,
|
|
struct ompi_communicator_t *comm,
|
|
struct ompi_request_t **request)
|
|
{
|
|
int rc;
|
|
|
|
mca_pml_dr_recv_request_t *recvreq;
|
|
MCA_PML_DR_RECV_REQUEST_ALLOC(recvreq, rc);
|
|
if (NULL == recvreq)
|
|
return rc;
|
|
|
|
MCA_PML_DR_RECV_REQUEST_INIT(recvreq,
|
|
addr,
|
|
count, datatype, src, tag, comm, false);
|
|
|
|
MCA_PML_DR_RECV_REQUEST_START(recvreq);
|
|
*request = (ompi_request_t *) recvreq;
|
|
return OMPI_SUCCESS;
|
|
}
|
|
|
|
|
|
int mca_pml_dr_recv(void *addr,
|
|
size_t count,
|
|
ompi_datatype_t * datatype,
|
|
int src,
|
|
int tag,
|
|
struct ompi_communicator_t *comm,
|
|
ompi_status_public_t * status)
|
|
{
|
|
int rc;
|
|
mca_pml_dr_recv_request_t *recvreq;
|
|
MCA_PML_DR_RECV_REQUEST_ALLOC(recvreq, rc);
|
|
if (NULL == recvreq)
|
|
return rc;
|
|
|
|
MCA_PML_DR_RECV_REQUEST_INIT(recvreq,
|
|
addr,
|
|
count, datatype, src, tag, comm, false);
|
|
|
|
MCA_PML_DR_RECV_REQUEST_START(recvreq);
|
|
ompi_request_wait_completion(&recvreq->req_recv.req_base.req_ompi);
|
|
|
|
if (NULL != status) { /* return status */
|
|
OMPI_STATUS_SET(status, &recvreq->req_recv.req_base.req_ompi.req_status);
|
|
}
|
|
rc = recvreq->req_recv.req_base.req_ompi.req_status.MPI_ERROR;
|
|
ompi_request_free( (ompi_request_t**)&recvreq );
|
|
return rc;
|
|
}
|
|
|