int MPIDI_CH3I_RMA_Make_progress_win(MPIR_Win * win_ptr, int *made_progress) { int mpi_errno = MPI_SUCCESS; int temp_progress = 0; (*made_progress) = 0; /* NOTE: this function is called from either synchronization routines * (MPI_WIN_FENCE, MPI_WIN_LOCK...), or aggressive cleanup functions. * It cannot be called from the progress engine. * Here we poke the progress engine if window state is not satisfied (i.e. NBC is not * finished). If it is allowed to be called from progress engine, when RMA progress * is registered / executed before NBC progress, it will cause the progress engine * to re-entrant RMA progress endlessly. */ /* check and try to switch window state, if it is not ready, poke the progress engine */ if (!WIN_READY(win_ptr)) { mpi_errno = poke_progress_engine(); if (mpi_errno != MPI_SUCCESS) MPIR_ERR_POP(mpi_errno); goto fn_exit; } mpi_errno = issue_ops_win(win_ptr, &temp_progress); if (mpi_errno != MPI_SUCCESS) MPIR_ERR_POP(mpi_errno); if (temp_progress) (*made_progress) = 1; fn_exit: return mpi_errno; fn_fail: goto fn_exit; }
int MPIDI_CH3I_RMA_Make_progress_global(int *made_progress) { MPIR_Win *win_ptr; int mpi_errno = MPI_SUCCESS; (*made_progress) = 0; if (MPIDI_RMA_Win_active_list_head == NULL) goto fn_exit; for (win_ptr = MPIDI_RMA_Win_active_list_head; win_ptr; win_ptr = win_ptr->next) { int temp_progress = 0; if (win_ptr->states.access_state == MPIDI_RMA_NONE) continue; /* check and try to switch window state */ if (!WIN_READY(win_ptr)) continue; mpi_errno = issue_ops_win(win_ptr, &temp_progress); if (mpi_errno != MPI_SUCCESS) MPIR_ERR_POP(mpi_errno); if (temp_progress) (*made_progress) = 1; } fn_exit: return mpi_errno; fn_fail: goto fn_exit; }
int MPIDI_CH3I_RMA_Make_progress_win(MPID_Win * win_ptr, int *made_progress) { int temp_progress = 0; int mpi_errno = MPI_SUCCESS; (*made_progress) = 0; /* check window state */ mpi_errno = check_window_state(win_ptr, &temp_progress); if (mpi_errno != MPI_SUCCESS) MPIU_ERR_POP(mpi_errno); if (temp_progress) (*made_progress) = 1; /* issue operations on window */ mpi_errno = issue_ops_win(win_ptr, &temp_progress); if (mpi_errno) MPIU_ERR_POP(mpi_errno); if (temp_progress) (*made_progress) = 1; fn_exit: return mpi_errno; fn_fail: goto fn_exit; }