/*
 * Copyright (c) 2004-2007 The Trustees of the University of Tennessee.
 *                         All rights reserved.
 * $COPYRIGHT$
 *
 * Additional copyrights may follow
 *
 * $HEADER$
 */

#include "ompi_config.h"
#include "ompi/request/request.h"
#include "ompi/mca/pml/base/pml_base_recvreq.h"
#include "vprotocol_pessimist.h"





int mca_vprotocol_pessimist_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 ret;

  V_OUTPUT_VERBOSE(50, "pessimist:\tirecv\trequest\t%"PRIpclock"\tfrom %d\ttag %d\tsize %lu",
                        mca_vprotocol_pessimist.clock, src, tag, (unsigned long) count);

  /* first, see if we have to enforce matching order */
  VPROTOCOL_PESSIMIST_MATCHING_REPLAY(src);
  /* now just let the host pml do its job */
  ret = mca_pml_v.host_pml.pml_irecv(addr, count, datatype, src, tag, comm, request);
  VPESSIMIST_FTREQ_INIT(*request);
  vprotocol_pessimist_matching_log_prepare(*request);
  return ret;
}





int mca_vprotocol_pessimist_recv(void *addr,
                      size_t count,
                      ompi_datatype_t * datatype,
                      int src,
                      int tag,
                      struct ompi_communicator_t *comm,
                      ompi_status_public_t * status )
{
  ompi_request_t *request = MPI_REQUEST_NULL;
  int ret;

  V_OUTPUT_VERBOSE(50, "pessimist:\trecv\tposted\t%"PRIpclock"\tfrom %d\ttag %d\tsize %lu",
                       mca_vprotocol_pessimist.clock, src, tag, (unsigned long) count);
  /* first, see if we have to enforce matching order */
  VPROTOCOL_PESSIMIST_MATCHING_REPLAY(src);
  /* now just let the pml do its job */
  ret = mca_pml_v.host_pml.pml_irecv(addr, count, datatype, src, tag, comm, &request);
  VPESSIMIST_FTREQ_INIT(request);
  vprotocol_pessimist_matching_log_prepare(request);
  /* block until the request is completed */
  VPROTOCOL_PESSIMIST_WAIT(&request, status, ret);
  return ret;
}