+\r
+ int File::lock()\r
+{\r
+ int rank = comm_->rank();\r
+ int size = comm_->size();\r
+ char waitlist[size];\r
+ char lock = 1;\r
+ int tag=444;\r
+ int i;\r
+ win_->lock(MPI_LOCK_EXCLUSIVE, 0, 0);\r
+ win_->put(&lock, 1, MPI_CHAR, 0, FP_SIZE+rank, 1, MPI_CHAR);\r
+ win_->get(waitlist, size, MPI_CHAR, 0, FP_SIZE, size, MPI_CHAR);\r
+ win_->get(&shared_file_pointer_ , 1 , MPI_OFFSET , 0 , 0, 1, MPI_OFFSET);\r
+ win_->unlock(0);\r
+ for (i = 0; i < size; i++) {\r
+ if (waitlist[i] == 1 && i != rank) {\r
+ // wait for the lock\r
+ MPI_Recv(&lock, 1, MPI_CHAR, MPI_ANY_SOURCE, tag, comm_, MPI_STATUS_IGNORE);\r
+ break;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+int File::unlock()\r
+{\r
+ int rank = comm_->rank();\r
+ int size = comm_->size();\r
+ char waitlist[size];\r
+ char lock = 0;\r
+ int tag=444;\r
+ int i, next;\r
+ win_->lock(MPI_LOCK_EXCLUSIVE, 0, 0);\r
+ win_->put(&lock, 1, MPI_CHAR, 0, FP_SIZE+rank, 1, MPI_CHAR);\r
+ win_->get(waitlist, size, MPI_CHAR, 0, FP_SIZE, size, MPI_CHAR);\r
+ shared_file_pointer_=file_->tell();\r
+ win_->put(&shared_file_pointer_, 1 , MPI_OFFSET , 0 , 0, 1, MPI_OFFSET);\r
+\r
+ win_->unlock(0);\r
+ next = (rank + 1 + size) % size;\r
+ for (i = 0; i < size; i++, next = (next + 1) % size) {\r
+ if (waitlist[next] == 1) {\r
+ MPI_Send(&lock, 1, MPI_CHAR, next, tag, comm_);\r
+ break;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r