diff options
Diffstat (limited to 'Source/cmFileLockPool.h')
-rw-r--r-- | Source/cmFileLockPool.h | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/Source/cmFileLockPool.h b/Source/cmFileLockPool.h new file mode 100644 index 0000000..f2f9f23 --- /dev/null +++ b/Source/cmFileLockPool.h @@ -0,0 +1,87 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#pragma once + +#include "cmConfigure.h" // IWYU pragma: keep + +#include <string> +#include <vector> + +#include "cmFileLock.h" + +class cmFileLockResult; + +class cmFileLockPool +{ +public: + cmFileLockPool(); + ~cmFileLockPool(); + + cmFileLockPool(cmFileLockPool const&) = delete; + cmFileLockPool& operator=(cmFileLockPool const&) = delete; + + //@{ + /** + * @brief Function scope control. + */ + void PushFunctionScope(); + void PopFunctionScope(); + //@} + + //@{ + /** + * @brief File scope control. + */ + void PushFileScope(); + void PopFileScope(); + //@} + + //@{ + /** + * @brief Lock the file in given scope. + * @param timeoutSec Lock timeout. If -1 try until success or fatal error. + */ + cmFileLockResult LockFunctionScope(const std::string& filename, + unsigned long timeoutSec); + cmFileLockResult LockFileScope(const std::string& filename, + unsigned long timeoutSec); + cmFileLockResult LockProcessScope(const std::string& filename, + unsigned long timeoutSec); + //@} + + /** + * @brief Unlock the file explicitly. + */ + cmFileLockResult Release(const std::string& filename); + +private: + bool IsAlreadyLocked(const std::string& filename) const; + + class ScopePool + { + public: + ScopePool(); + ~ScopePool(); + + ScopePool(ScopePool const&) = delete; + ScopePool(ScopePool&&) noexcept; + ScopePool& operator=(ScopePool const&) = delete; + ScopePool& operator=(ScopePool&&) noexcept; + + cmFileLockResult Lock(const std::string& filename, + unsigned long timeoutSec); + cmFileLockResult Release(const std::string& filename); + bool IsAlreadyLocked(const std::string& filename) const; + + private: + using List = std::vector<cmFileLock>; + + List Locks; + }; + + using List = std::vector<ScopePool>; + + List FunctionScopes; + List FileScopes; + ScopePool ProcessScope; +}; |