util/system.cpp: add thread safety annotations for dir_locks

pull/16127/head
Anthony Towns 5 years ago
parent a788789948
commit e685ca1992

@ -3,6 +3,7 @@
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <sync.h>
#include <util/system.h> #include <util/system.h>
#include <chainparamsbase.h> #include <chainparamsbase.h>
@ -75,18 +76,18 @@ const char * const BITCOIN_CONF_FILENAME = "bitcoin.conf";
ArgsManager gArgs; ArgsManager gArgs;
/** Mutex to protect dir_locks. */
static Mutex cs_dir_locks;
/** A map that contains all the currently held directory locks. After /** A map that contains all the currently held directory locks. After
* successful locking, these will be held here until the global destructor * successful locking, these will be held here until the global destructor
* cleans them up and thus automatically unlocks them, or ReleaseDirectoryLocks * cleans them up and thus automatically unlocks them, or ReleaseDirectoryLocks
* is called. * is called.
*/ */
static std::map<std::string, std::unique_ptr<fsbridge::FileLock>> dir_locks; static std::map<std::string, std::unique_ptr<fsbridge::FileLock>> dir_locks GUARDED_BY(cs_dir_locks);
/** Mutex to protect dir_locks. */
static std::mutex cs_dir_locks;
bool LockDirectory(const fs::path& directory, const std::string lockfile_name, bool probe_only) bool LockDirectory(const fs::path& directory, const std::string lockfile_name, bool probe_only)
{ {
std::lock_guard<std::mutex> ulock(cs_dir_locks); LOCK(cs_dir_locks);
fs::path pathLockFile = directory / lockfile_name; fs::path pathLockFile = directory / lockfile_name;
// If a lock for this directory already exists in the map, don't try to re-lock it // If a lock for this directory already exists in the map, don't try to re-lock it
@ -110,13 +111,13 @@ bool LockDirectory(const fs::path& directory, const std::string lockfile_name, b
void UnlockDirectory(const fs::path& directory, const std::string& lockfile_name) void UnlockDirectory(const fs::path& directory, const std::string& lockfile_name)
{ {
std::lock_guard<std::mutex> lock(cs_dir_locks); LOCK(cs_dir_locks);
dir_locks.erase((directory / lockfile_name).string()); dir_locks.erase((directory / lockfile_name).string());
} }
void ReleaseDirectoryLocks() void ReleaseDirectoryLocks()
{ {
std::lock_guard<std::mutex> ulock(cs_dir_locks); LOCK(cs_dir_locks);
dir_locks.clear(); dir_locks.clear();
} }

Loading…
Cancel
Save