FileFd: fix sleeping while mutex is locked

GitOrigin-RevId: fb6b5bb1967a4c144e9393b2ab82ccf6dfe2f15a
This commit is contained in:
Arseny Smirnov 2018-10-30 11:21:16 +03:00
parent ad686717e7
commit 4e03ee1293

View File

@ -301,8 +301,16 @@ Status FileFd::lock(const LockFlags flags, const string &path, int32 max_tries)
CHECK(flags == LockFlags::Write); CHECK(flags == LockFlags::Write);
VLOG(fd) << "Trying to lock file \"" << path << '"'; VLOG(fd) << "Trying to lock file \"" << path << '"';
while (true) { while (true) {
std::unique_lock<std::mutex> lock(in_process_lock_mutex); { // mutex lock scope
if (locked_files.find(path) != locked_files.end()) { std::lock_guard<std::mutex> lock(in_process_lock_mutex);
if (locked_files.find(path) == locked_files.end()) {
VLOG(fd) << "Lock file \"" << path << '"';
need_local_unlock = true;
locked_files.insert(path);
break;
}
}
if (--max_tries > 0) { if (--max_tries > 0) {
usleep_for(100000); usleep_for(100000);
continue; continue;
@ -311,12 +319,6 @@ Status FileFd::lock(const LockFlags flags, const string &path, int32 max_tries)
return Status::Error( return Status::Error(
0, PSLICE() << "Can't lock file \"" << path << "\", because it is already in use by current program"); 0, PSLICE() << "Can't lock file \"" << path << "\", because it is already in use by current program");
} }
VLOG(fd) << "Lock file \"" << path << '"';
need_local_unlock = true;
locked_files.insert(path);
break;
}
} }
} }
SCOPE_EXIT { SCOPE_EXIT {