- int i;
-
- /* Connect our log channels: that must be done manually under windows */
-#ifdef XBT_LOG_CONNECT
- XBT_LOG_CONNECT(smpi_base, smpi);
- XBT_LOG_CONNECT(smpi_bench, smpi);
- XBT_LOG_CONNECT(smpi_kernel, smpi);
- XBT_LOG_CONNECT(smpi_mpi, smpi);
- XBT_LOG_CONNECT(smpi_receiver, smpi);
- XBT_LOG_CONNECT(smpi_sender, smpi);
- XBT_LOG_CONNECT(smpi_util, smpi);
-#endif
-
- smpi_global = xbt_new(s_smpi_global_t, 1);
- // config variable
- smpi_global->reference_speed = SMPI_DEFAULT_SPEED;
-
- // mallocators
- smpi_global->request_mallocator =
- xbt_mallocator_new(SMPI_REQUEST_MALLOCATOR_SIZE, smpi_request_new,
- smpi_request_free, smpi_request_reset);
- smpi_global->message_mallocator =
- xbt_mallocator_new(SMPI_MESSAGE_MALLOCATOR_SIZE, smpi_message_new,
- smpi_message_free, smpi_message_reset);
-
- smpi_global->process_count = SIMIX_process_count();
- DEBUG1("There is %d processes",smpi_global->process_count);
-
- // sender/receiver processes
- smpi_global->main_processes = xbt_new(smx_process_t, smpi_global->process_count);
-
- // timers
- smpi_global->timer = xbt_os_timer_new();
- smpi_global->timer_mutex = SIMIX_mutex_init();
- smpi_global->timer_cond = SIMIX_cond_init();
-
- smpi_global->do_once_duration_nodes = NULL;
- smpi_global->do_once_duration = NULL;
- smpi_global->do_once_mutex = SIMIX_mutex_init();
-
-
- smpi_mpi_global = xbt_new(s_smpi_mpi_global_t, 1);
-
- // global communicator
- smpi_mpi_global->mpi_comm_world = xbt_new(s_smpi_mpi_communicator_t, 1);
- smpi_mpi_global->mpi_comm_world->size = smpi_global->process_count;
- smpi_mpi_global->mpi_comm_world->barrier_count = 0;
- smpi_mpi_global->mpi_comm_world->barrier_mutex = SIMIX_mutex_init();
- smpi_mpi_global->mpi_comm_world->barrier_cond = SIMIX_cond_init();
- smpi_mpi_global->mpi_comm_world->rank_to_index_map =
- xbt_new(int, smpi_global->process_count);
- smpi_mpi_global->mpi_comm_world->index_to_rank_map =
- xbt_new(int, smpi_global->process_count);
- for (i = 0; i < smpi_global->process_count; i++) {
- smpi_mpi_global->mpi_comm_world->rank_to_index_map[i] = i;
- smpi_mpi_global->mpi_comm_world->index_to_rank_map[i] = i;
+ int index = smpi_group_index(smpi_comm_group(comm), request->dst);
+ smpi_process_data_t data = smpi_process_remote_data(index);
+ xbt_fifo_item_t item;
+ MPI_Request req;
+
+ print_request("Isend", request);
+ 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)) {
+ print_request("Match found", req);
+ 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->match = request;
+ request->rdv = req->rdv;
+ request->match = req;
+ return;
+ }