Exemple #1
0
START_CPLUSPLUS

/**************************************************************************/
/* GLOBAL **************         pyMPI_recv        ************************/
/**************************************************************************/
/* Receive a message on a communicator object given source and tag        */
/**************************************************************************/
PyObject* pyMPI_recv(PyMPI_Comm* self, int source, int tag) {
  PyMPI_Message buffer1;
  char*     buffer2 = 0;
  PyObject* result = 0;
  PyObject* result_status = 0;
  MPI_Status status;

  /* ----------------------------------------------- */
  /* MPI better be in ready state                    */
  /* ----------------------------------------------- */
  RAISEIFNOMPI();

  /* ----------------------------------------------- */
  /* Initial message                                 */ 
  /* ----------------------------------------------- */
  Assert(self);
  MPICHECK( self->communicator,
            MPI_Recv(&buffer1,
                     1, pyMPI_message_datatype,
                     source,tag,
                     self->communicator,&status)  );

  /* ----------------------------------------------- */
  /* Update the actual source/tag if we used         */
  /* wildcards                                       */
  /* ----------------------------------------------- */
  if ( source == MPI_ANY_SOURCE ) source = status.MPI_SOURCE;
  if ( tag == MPI_ANY_TAG ) tag = status.MPI_TAG;

  if ( buffer1.header.bytes_in_second_message ) {
    buffer2 = (char*)malloc(buffer1.header.bytes_in_second_message);
    Assert(buffer2);
    MPI_Recv(buffer2,
             buffer1.header.bytes_in_second_message,
             MPI_BYTE,source,tag,
             self->communicator,&status);
    buffer1.header.free_buffer = 1; /* This malloc'd space needs to be freed */
  }

  PYCHECK(result /*owned*/ = pyMPI_unpack(&buffer1,&buffer2));
  PYCHECK(result_status/*owned*/ = pyMPI_resultstatus(/*consumes*/result,status) );
  return result_status;

 pythonError:
  pyMPI_message_free(&buffer1,&buffer2);
  return 0;
}
/*ARGSUSED*/
static PyObject* finalize(PyObject* pySelf, PyObject* args) {
   static int finalized = 0;
   /* ----------------------------------------------- */
   /* MPI better be in ready state                    */
   /* ----------------------------------------------- */
   NOARGUMENTS();
   RAISEIFNOMPI();

   /* ----------------------------------------------- */
   /* Don't call multiple times                       */
   /* ----------------------------------------------- */
   MPICHECKCOMMLESS( PyMPI_Finalized(&finalized) );
   if ( !finalized ) {
      Assert(PyMPI_finalizeMPI);
      MPICHECKCOMMLESS( PyMPI_finalizeMPI() ); /* Normally MPI_Finalize */
      PyMPI_IHaveFinalizedMPI();
   }
   
   Py_XINCREF(Py_None);
   return Py_None;

 pythonError:
   return 0;
}