-
- // mpi datatypes
- smpi_mpi_global->mpi_byte = xbt_new(s_smpi_mpi_datatype_t, 1); /* we can think of it as a placeholder for value*/
- smpi_mpi_global->mpi_byte->size = (size_t) 1;
- smpi_mpi_global->mpi_byte->lb = (ptrdiff_t) 0;
- smpi_mpi_global->mpi_byte->ub = smpi_mpi_global->mpi_byte->lb + smpi_mpi_global->mpi_byte->size;
- smpi_mpi_global->mpi_byte->flags = DT_FLAG_BASIC;
-
- smpi_mpi_global->mpi_char = xbt_new(s_smpi_mpi_datatype_t, 1);
- smpi_mpi_global->mpi_char->size = (size_t) 1;
- smpi_mpi_global->mpi_char->lb = (ptrdiff_t) 0; //&(smpi_mpi_global->mpi_char);
- smpi_mpi_global->mpi_char->ub = smpi_mpi_global->mpi_char->lb + smpi_mpi_global->mpi_char->size;
- smpi_mpi_global->mpi_char->flags = DT_FLAG_BASIC;
-
- smpi_mpi_global->mpi_int = xbt_new(s_smpi_mpi_datatype_t, 1);
- smpi_mpi_global->mpi_int->size = sizeof(int);
- smpi_mpi_global->mpi_int->lb = (ptrdiff_t) 0; // &(smpi_mpi_global->mpi_int);
- smpi_mpi_global->mpi_int->ub = smpi_mpi_global->mpi_int->lb + smpi_mpi_global->mpi_int->size;
- smpi_mpi_global->mpi_int->flags = DT_FLAG_BASIC;
-
- smpi_mpi_global->mpi_float = xbt_new(s_smpi_mpi_datatype_t, 1);
- smpi_mpi_global->mpi_float->size = sizeof(float);
- smpi_mpi_global->mpi_float->lb = (ptrdiff_t) 0; // &(smpi_mpi_global->mpi_float);
- smpi_mpi_global->mpi_float->ub = smpi_mpi_global->mpi_float->lb + smpi_mpi_global->mpi_float->size;
- smpi_mpi_global->mpi_float->flags = DT_FLAG_BASIC;
-
- smpi_mpi_global->mpi_double = xbt_new(s_smpi_mpi_datatype_t, 1);
- smpi_mpi_global->mpi_double->size = sizeof(double);
- smpi_mpi_global->mpi_double->lb = (ptrdiff_t) 0; //&(smpi_mpi_global->mpi_float);
- smpi_mpi_global->mpi_double->ub = smpi_mpi_global->mpi_double->lb + smpi_mpi_global->mpi_double->size;
- smpi_mpi_global->mpi_double->flags = DT_FLAG_BASIC;
-
- // mpi operations
- smpi_mpi_global->mpi_land = xbt_new(s_smpi_mpi_op_t, 1);
- smpi_mpi_global->mpi_land->func = smpi_mpi_land_func;
- smpi_mpi_global->mpi_sum = xbt_new(s_smpi_mpi_op_t, 1);
- smpi_mpi_global->mpi_sum->func = smpi_mpi_sum_func;
- smpi_mpi_global->mpi_prod = xbt_new(s_smpi_mpi_op_t, 1);
- smpi_mpi_global->mpi_prod->func = smpi_mpi_prod_func;
- smpi_mpi_global->mpi_min = xbt_new(s_smpi_mpi_op_t, 1);
- smpi_mpi_global->mpi_min->func = smpi_mpi_min_func;
- smpi_mpi_global->mpi_max = xbt_new(s_smpi_mpi_op_t, 1);
- smpi_mpi_global->mpi_max->func = smpi_mpi_max_func;
-
-}
-
-void smpi_global_destroy()
-{
- smpi_do_once_duration_node_t curr, next;
-
- // processes
- xbt_free(smpi_global->main_processes);
-
- // mallocators
- xbt_mallocator_free(smpi_global->request_mallocator);
- xbt_mallocator_free(smpi_global->message_mallocator);
-
- xbt_os_timer_free(smpi_global->timer);
- SIMIX_cond_destroy(smpi_global->timer_cond);
-
- for (curr = smpi_global->do_once_duration_nodes; NULL != curr; curr = next) {
- next = curr->next;
- xbt_free(curr->file);
- xbt_free(curr);
+ 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;
+
+ print_request("Irecv", request);
+ 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)){
+ print_request("Match found", req);
+ xbt_fifo_remove_item(data->pending_sent, item);
+ /* Materialize the *_ANY_* fields from the irecv request */
+ req->match = request;
+ request->src = req->src;
+ request->tag = req->tag;
+ request->rdv = req->rdv;
+ request->match = req;
+ return;
+ }