| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #ifndef cmFileLock_h |
| #define cmFileLock_h |
| |
| #include "cmConfigure.h" // IWYU pragma: keep |
| |
| #include <string> |
| |
| #if defined(_WIN32) |
| # include <windows.h> // HANDLE |
| #endif |
| |
| class cmFileLockResult; |
| |
| /** |
| * @brief Cross-platform file locking. |
| * @details Under the hood this class use 'fcntl' for Unix-like platforms and |
| * 'LockFileEx'/'UnlockFileEx' for Win32 platform. Locks are exclusive and |
| * advisory. |
| */ |
| class cmFileLock |
| { |
| public: |
| cmFileLock(); |
| ~cmFileLock(); |
| |
| cmFileLock(cmFileLock const&) = delete; |
| cmFileLock& operator=(cmFileLock const&) = delete; |
| |
| /** |
| * @brief Lock the file. |
| * @param timeoutSec Lock timeout. If -1 try until success or fatal error. |
| */ |
| cmFileLockResult Lock(const std::string& filename, unsigned long timeoutSec); |
| |
| /** |
| * @brief Unlock the file. |
| */ |
| cmFileLockResult Release(); |
| |
| /** |
| * @brief Check file is locked by this class. |
| * @details This function helps to find double locks (deadlocks) and to do |
| * explicit unlocks. |
| */ |
| bool IsLocked(const std::string& filename) const; |
| |
| private: |
| cmFileLockResult OpenFile(); |
| cmFileLockResult LockWithoutTimeout(); |
| cmFileLockResult LockWithTimeout(unsigned long timeoutSec); |
| |
| #if defined(_WIN32) |
| HANDLE File = INVALID_HANDLE_VALUE; |
| BOOL LockFile(DWORD flags); |
| #else |
| int File = -1; |
| int LockFile(int cmd, int type); |
| #endif |
| |
| std::string Filename; |
| }; |
| |
| #endif // cmFileLock_h |