summaryrefslogtreecommitdiffstats
path: root/Source/cmFileLock.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmFileLock.cxx')
-rw-r--r--Source/cmFileLock.cxx60
1 files changed, 60 insertions, 0 deletions
diff --git a/Source/cmFileLock.cxx b/Source/cmFileLock.cxx
new file mode 100644
index 0000000..786d6c6
--- /dev/null
+++ b/Source/cmFileLock.cxx
@@ -0,0 +1,60 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+#include "cmFileLock.h"
+
+#include "cmFileLockResult.h"
+#include <assert.h>
+
+// Common implementation
+
+cmFileLock::~cmFileLock()
+{
+ if (!this->Filename.empty()) {
+ const cmFileLockResult result = this->Release();
+ static_cast<void>(result);
+ assert(result.IsOk());
+ }
+}
+
+cmFileLockResult cmFileLock::Lock(const std::string& filename,
+ unsigned long timeout)
+{
+ if (filename.empty()) {
+ // Error is internal since all the directories and file must be created
+ // before actual lock called.
+ return cmFileLockResult::MakeInternal();
+ }
+
+ if (!this->Filename.empty()) {
+ // Error is internal since double-lock must be checked in class
+ // cmFileLockPool by the cmFileLock::IsLocked method.
+ return cmFileLockResult::MakeInternal();
+ }
+
+ this->Filename = filename;
+ cmFileLockResult result = this->OpenFile();
+ if (result.IsOk()) {
+ if (timeout == static_cast<unsigned long>(-1)) {
+ result = this->LockWithoutTimeout();
+ } else {
+ result = this->LockWithTimeout(timeout);
+ }
+ }
+
+ if (!result.IsOk()) {
+ this->Filename = "";
+ }
+
+ return result;
+}
+
+bool cmFileLock::IsLocked(const std::string& filename) const
+{
+ return filename == this->Filename;
+}
+
+#if defined(_WIN32)
+#include "cmFileLockWin32.cxx"
+#else
+#include "cmFileLockUnix.cxx"
+#endif