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/cmFileLockPool.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/cmFileLockPool.h')
-rw-r--r-- | Source/cmFileLockPool.h | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/Source/cmFileLockPool.h b/Source/cmFileLockPool.h new file mode 100644 index 0000000..a63540c --- /dev/null +++ b/Source/cmFileLockPool.h @@ -0,0 +1,100 @@ +/*============================================================================ + 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 cmFileLockPool_h +#define cmFileLockPool_h + +#include "cmStandardIncludes.h" + +class cmFileLockResult; +class cmFileLock; + +class cmFileLockPool +{ + public: + cmFileLockPool(); + ~cmFileLockPool(); + + //@{ + /** + * @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 timeoutSec + ); + cmFileLockResult LockFileScope( + const std::string& filename, unsigned timeoutSec + ); + cmFileLockResult LockProcessScope( + const std::string& filename, unsigned timeoutSec + ); + //@} + + /** + * @brief Unlock the file explicitly. + */ + cmFileLockResult Release(const std::string& filename); + + private: + cmFileLockPool(const cmFileLockPool&); + cmFileLockPool& operator=(const cmFileLockPool&); + + bool IsAlreadyLocked(const std::string& filename) const; + + class ScopePool + { + public: + ScopePool(); + ~ScopePool(); + + cmFileLockResult Lock(const std::string& filename, unsigned timeoutSec); + cmFileLockResult Release(const std::string& filename); + bool IsAlreadyLocked(const std::string& filename) const; + + private: + ScopePool(const ScopePool&); + ScopePool& operator=(const ScopePool&); + + typedef std::list<cmFileLock*> List; + typedef List::iterator It; + typedef List::const_iterator CIt; + + List Locks; + }; + + typedef std::list<ScopePool*> List; + + typedef List::iterator It; + typedef List::const_iterator CIt; + + List FunctionScopes; + List FileScopes; + ScopePool ProcessScope; +}; + +#endif // cmFileLockPool_h |