- 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