mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-20 22:04:19 +02:00
util/system.cpp: add thread safety annotations for dir_locks
This commit is contained in:
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…
x
Reference in New Issue
Block a user