A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Debug in progress :\
[simgrid.git]
/
src
/
smpi
/
smpi_win.cpp
diff --git
a/src/smpi/smpi_win.cpp
b/src/smpi/smpi_win.cpp
index
9333f02
..
b522dcf
100644
(file)
--- 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 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
//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_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_);
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];
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_);
xbt_mutex_acquire(target_win->mut_);
+ int size=target_win->lockers_.size();
target_win->lockers_.remove(comm_->rank());
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_);
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;
}
return MPI_SUCCESS;
}
@@
-472,11
+479,11
@@
Win* Win::f2c(int id){
int Win::finish_comms(){
int Win::finish_comms(){
+ xbt_mutex_acquire(mut_);
//Finish own requests
std::vector<MPI_Request> *reqqs = requests_;
int size = static_cast<int>(reqqs->size());
if (size > 0) {
//Finish own requests
std::vector<MPI_Request> *reqqs = requests_;
int size = static_cast<int>(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))
// 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();
MPI_Request* treqs = &(*reqqs)[0];
Request::waitall(size, treqs, MPI_STATUSES_IGNORE);
reqqs->clear();
- xbt_mutex_release(mut_);
}
}
-
+ xbt_mutex_release(mut_);
return size;
}
return size;
}