diff options
author | Ruslan Baratov <ruslan_baratov@yahoo.com> | 2014-11-25 22:49:25 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2014-12-03 14:47:44 (GMT) |
commit | e6db4c5a4ede8039ed525e3facebd7e0eb7ec1b7 (patch) | |
tree | f5e6a3dce7b89725f9fa4e5fcafd040114a85466 /Source/cmFileLock.h | |
parent | 05d6531c7a8ecfad513a0e76b44b273b70fa919b (diff) | |
download | CMake-e6db4c5a4ede8039ed525e3facebd7e0eb7ec1b7.zip CMake-e6db4c5a4ede8039ed525e3facebd7e0eb7ec1b7.tar.gz CMake-e6db4c5a4ede8039ed525e3facebd7e0eb7ec1b7.tar.bz2 |
file: Add LOCK subcommand to do file and directory locking
Provide options to fail without blocking or to block up to a timeout.
Provide options to specify the scope containing the lock so it can be
released automatically at the end of a function, file, or process.
Extend the RunCMake.file test with cases covering the file(LOCK) command
usage and error cases.
Diffstat (limited to 'Source/cmFileLock.h')
-rw-r--r-- | Source/cmFileLock.h | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/Source/cmFileLock.h b/Source/cmFileLock.h new file mode 100644 index 0000000..4d922a0 --- /dev/null +++ b/Source/cmFileLock.h @@ -0,0 +1,74 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2014 Ruslan Baratov + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ + +#ifndef cmFileLock_h +#define cmFileLock_h + +#include "cmStandardIncludes.h" + +#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(); + + /** + * @brief Lock the file. + * @param timeoutSec Lock timeout. If -1 try until success or fatal error. + */ + cmFileLockResult Lock(const std::string& filename, unsigned 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: + cmFileLock(const cmFileLock&); + cmFileLock& operator=(const cmFileLock&); + + cmFileLockResult OpenFile(); + cmFileLockResult LockWithoutTimeout(); + cmFileLockResult LockWithTimeout(unsigned timeoutSec); + +#if defined(_WIN32) + typedef HANDLE FileId; + BOOL LockFile(DWORD flags); +#else + typedef int FileId; + int LockFile(int cmd, int type); +#endif + + FileId File; + std::string Filename; +}; + +#endif // cmFileLock_h |