int MPI_Win_wait_C_Wrapper (MPI_Win win) { int res; TRACE_MPIEVENT(LAST_READ_TIME, MPI_WIN_WAIT_EV, EVT_BEGIN, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY); res = PMPI_Win_wait (win); TRACE_MPIEVENT(TIME, MPI_WIN_WAIT_EV, EVT_END, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY); updateStats_OTHER(global_mpi_stats); return res; }
int MPI_Win_wait(MPI_Win win) { MTCORE_Win *uh_win; int mpi_errno = MPI_SUCCESS; int post_grp_size = 0; int i; MTCORE_DBG_PRINT_FCNAME(); MTCORE_Fetch_uh_win_from_cache(win, uh_win); if (uh_win == NULL) { /* normal window */ return PMPI_Win_wait(win); } MTCORE_Assert((uh_win->info_args.epoch_type & MTCORE_EPOCH_PSCW)); if (uh_win->post_group == MPI_GROUP_NULL) { /* standard says do nothing for empty group */ MTCORE_DBG_PRINT("Wait empty group\n"); return mpi_errno; } mpi_errno = PMPI_Group_size(uh_win->post_group, &post_grp_size); if (mpi_errno != MPI_SUCCESS) goto fn_fail; MTCORE_Assert(post_grp_size > 0); MTCORE_DBG_PRINT("Wait group 0x%x, size %d\n", uh_win->post_group, post_grp_size); /* Wait for the completion on all origin processes */ mpi_errno = MTCORE_Wait_pscw_complete_msg(post_grp_size, uh_win); if (mpi_errno != MPI_SUCCESS) goto fn_fail; /* TODO: MPI implementation should do memory barrier in flush handler. */ mpi_errno = PMPI_Win_sync(uh_win->active_win); if (mpi_errno != MPI_SUCCESS) goto fn_fail; MTCORE_DBG_PRINT("Wait done\n"); fn_exit: if (uh_win->post_ranks_in_win_group) free(uh_win->post_ranks_in_win_group); uh_win->post_group = MPI_GROUP_NULL; uh_win->post_ranks_in_win_group = NULL; return mpi_errno; fn_fail: goto fn_exit; }
int MPI_Win_wait(MPI_Win win){ return PMPI_Win_wait(win); }