-/* FIXME: understand what they do and put the prototypes in a header file (live in smpi_base.c) */
-void smpi_mpi_land_func(void *a, void *b, int *length,
- MPI_Datatype * datatype);
-void smpi_mpi_sum_func(void *a, void *b, int *length,
- MPI_Datatype * datatype);
-void smpi_mpi_prod_func(void *a, void *b, int *length,
- MPI_Datatype * datatype);
-void smpi_mpi_min_func(void *a, void *b, int *length,
- MPI_Datatype * datatype);
-void smpi_mpi_max_func(void *a, void *b, int *length,
- MPI_Datatype * datatype);
-
-void smpi_init()
-{
- smpi_global = xbt_new(s_smpi_global_t, 1);
+ DEBUG4("isend for request %p [src = %d, dst = %d, tag = %d]",
+ request, request->src, request->dst, request->tag);
+ xbt_fifo_foreach(data->pending_recv, item, req, MPI_Request) {
+ if(req->comm == request->comm
+ && (req->src == MPI_ANY_SOURCE || req->src == request->src)
+ && (req->tag == MPI_ANY_TAG || req->tag == request->tag)){
+ DEBUG4("find matching request %p [src = %d, dst = %d, tag = %d]",
+ req, req->src, req->dst, req->tag);
+ xbt_fifo_remove_item(data->pending_recv, item);
+ /* Materialize the *_ANY_* fields from corresponding irecv request */
+ req->src = request->src;
+ req->tag = request->tag;
+ req->data = request->data;
+ request->rdv = req->rdv;
+ return;
+ } else {
+ DEBUG4("not matching request %p [src = %d, dst = %d, tag = %d]",
+ req, req->src, req->dst, req->tag);
+ }
+ }
+ request->rdv = SIMIX_rdv_create(NULL);
+ xbt_fifo_push(data->pending_sent, request);
+}
+
+void smpi_process_post_recv(MPI_Request request) {
+ smpi_process_data_t data = smpi_process_data();
+ xbt_fifo_item_t item;
+ MPI_Request req;
+
+ DEBUG4("irecv for request %p [src = %d, dst = %d, tag = %d]",
+ request, request->src, request->dst, request->tag);
+ xbt_fifo_foreach(data->pending_sent, item, req, MPI_Request) {
+ if(req->comm == request->comm
+ && (request->src == MPI_ANY_SOURCE || req->src == request->src)
+ && (request->tag == MPI_ANY_TAG || req->tag == request->tag)){
+ DEBUG4("find matching request %p [src = %d, dst = %d, tag = %d]",
+ req, req->src, req->dst, req->tag);
+ xbt_fifo_remove_item(data->pending_sent, item);
+ /* Materialize the *_ANY_* fields from the irecv request */
+ request->src = req->src;
+ request->tag = req->tag;
+ request->data = req->data;
+ request->rdv = req->rdv;
+ return;
+ } else {
+ DEBUG4("not matching request %p [src = %d, dst = %d, tag = %d]",
+ req, req->src, req->dst, req->tag);
+ }
+ }
+ request->rdv = SIMIX_rdv_create(NULL);
+ xbt_fifo_push(data->pending_recv, request);