From 8eefc320a65bf89b70487906ee5cda20864eedf5 Mon Sep 17 00:00:00 2001 From: degomme Date: Mon, 20 Mar 2017 19:08:22 +0100 Subject: [PATCH] Debug in progress :\ --- src/smpi/smpi_win.cpp | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/smpi/smpi_win.cpp b/src/smpi/smpi_win.cpp index 9333f02732..b522dcf06b 100644 --- a/src/smpi/smpi_win.cpp +++ b/src/smpi/smpi_win.cpp @@ -437,32 +437,39 @@ int Win::wait(){ int Win::lock(int lock_type, int rank, int assert){ MPI_Win target_win = connected_wins_[rank]; - int finished = finish_comms(); - XBT_DEBUG("Win_lock - Finished %d RMA calls", finished); - //window already locked, we have to wait - if (lock_type == MPI_LOCK_EXCLUSIVE) + if (lock_type == MPI_LOCK_EXCLUSIVE){ + XBT_DEBUG("Win_lock - Entering lock %d", rank); xbt_mutex_acquire(target_win->lock_mut_); + XBT_DEBUG("Win_lock - Released from lock %d", rank); +} xbt_mutex_acquire(target_win->mut_); target_win->lockers_.push_back(comm_->rank()); xbt_mutex_release(target_win->mut_); + int finished = finish_comms(); + XBT_DEBUG("Win_lock - Finished %d RMA calls", finished); + return MPI_SUCCESS; } int Win::unlock(int rank){ MPI_Win target_win = connected_wins_[rank]; - int finished = finish_comms(); - XBT_DEBUG("Win_unlock - Finished %d RMA calls", finished); - xbt_mutex_acquire(target_win->mut_); + int size=target_win->lockers_.size(); target_win->lockers_.remove(comm_->rank()); + + + if (size<=1){//0 or 1 lockers -> exclusive assumed + xbt_mutex_try_acquire(target_win->lock_mut_); + xbt_mutex_release(target_win->lock_mut_); + } xbt_mutex_release(target_win->mut_); + int finished = finish_comms(); + XBT_DEBUG("Win_unlock - Finished %d RMA calls", finished); - xbt_mutex_try_acquire(target_win->lock_mut_); - xbt_mutex_release(target_win->lock_mut_); return MPI_SUCCESS; } @@ -472,11 +479,11 @@ Win* Win::f2c(int id){ int Win::finish_comms(){ + xbt_mutex_acquire(mut_); //Finish own requests std::vector *reqqs = requests_; int size = static_cast(reqqs->size()); if (size > 0) { - xbt_mutex_acquire(mut_); // start all requests that have been prepared by another process for (const auto& req : *reqqs) { if (req && (req->flags() & PREPARED)) @@ -486,9 +493,8 @@ int Win::finish_comms(){ MPI_Request* treqs = &(*reqqs)[0]; Request::waitall(size, treqs, MPI_STATUSES_IGNORE); reqqs->clear(); - xbt_mutex_release(mut_); } - + xbt_mutex_release(mut_); return size; } -- 2.20.1