+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;
+ }
+ }
+ request->rdv = SIMIX_rdv_create(NULL);
+ xbt_fifo_push(data->pending_recv, request);
+}
+
+void smpi_global_init(void) {
+ int i;
+ MPI_Group group;
+
+ SIMIX_network_set_copy_data_callback(&SIMIX_network_copy_buffer_callback);
+ process_count = SIMIX_process_count();
+ process_data = xbt_new(smpi_process_data_t, process_count);
+ for(i = 0; i < process_count; i++) {
+ process_data[i] = xbt_new(s_smpi_process_data_t, 1);
+ process_data[i]->index = i;
+ process_data[i]->pending_sent = xbt_fifo_new();
+ process_data[i]->pending_recv = xbt_fifo_new();
+ process_data[i]->timer = xbt_os_timer_new();
+ group = smpi_group_new(1);
+ process_data[i]->comm_self = smpi_comm_new(group);
+ smpi_group_set_mapping(group, i, 0);
+ }
+ group = smpi_group_new(process_count);
+ MPI_COMM_WORLD = smpi_comm_new(group);
+ for(i = 0; i < process_count; i++) {
+ smpi_group_set_mapping(group, i, i);
+ }
+}
+
+void smpi_global_destroy(void) {
+ int count = smpi_process_count();
+ int i;
+
+ smpi_bench_destroy();
+ smpi_comm_destroy(MPI_COMM_WORLD);
+ MPI_COMM_WORLD = MPI_COMM_NULL;
+ for(i = 0; i < count; i++) {
+ smpi_comm_destroy(process_data[i]->comm_self);
+ xbt_os_timer_free(process_data[i]->timer);
+ xbt_fifo_free(process_data[i]->pending_recv);
+ xbt_fifo_free(process_data[i]->pending_sent);
+ xbt_free(process_data[i]);
+ }
+ xbt_free(process_data);
+ process_data = NULL;
+}
+
+int main(int argc, char **argv)