LLVM  9.0.0svn
LockFileManager.h
Go to the documentation of this file.
1 //===--- LockFileManager.h - File-level locking utility ---------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 #ifndef LLVM_SUPPORT_LOCKFILEMANAGER_H
9 #define LLVM_SUPPORT_LOCKFILEMANAGER_H
10 
11 #include "llvm/ADT/Optional.h"
12 #include "llvm/ADT/SmallString.h"
13 #include <system_error>
14 #include <utility> // for std::pair
15 
16 namespace llvm {
17 class StringRef;
18 
19 /// Class that manages the creation of a lock file to aid
20 /// implicit coordination between different processes.
21 ///
22 /// The implicit coordination works by creating a ".lock" file alongside
23 /// the file that we're coordinating for, using the atomicity of the file
24 /// system to ensure that only a single process can create that ".lock" file.
25 /// When the lock file is removed, the owning process has finished the
26 /// operation.
28 public:
29  /// Describes the state of a lock file.
31  /// The lock file has been created and is owned by this instance
32  /// of the object.
34  /// The lock file already exists and is owned by some other
35  /// instance.
37  /// An error occurred while trying to create or find the lock
38  /// file.
40  };
41 
42  /// Describes the result of waiting for the owner to release the lock.
44  /// The lock was released successfully.
46  /// Owner died while holding the lock.
48  /// Reached timeout while waiting for the owner to release the lock.
50  };
51 
52 private:
53  SmallString<128> FileName;
54  SmallString<128> LockFileName;
55  SmallString<128> UniqueLockFileName;
56 
58  std::error_code ErrorCode;
59  std::string ErrorDiagMsg;
60 
61  LockFileManager(const LockFileManager &) = delete;
62  LockFileManager &operator=(const LockFileManager &) = delete;
63 
65  readLockFile(StringRef LockFileName);
66 
67  static bool processStillExecuting(StringRef Hostname, int PID);
68 
69 public:
70 
71  LockFileManager(StringRef FileName);
73 
74  /// Determine the state of the lock file.
75  LockFileState getState() const;
76 
77  operator LockFileState() const { return getState(); }
78 
79  /// For a shared lock, wait until the owner releases the lock.
81 
82  /// Remove the lock file. This may delete a different lock file than
83  /// the one previously read if there is a race.
84  std::error_code unsafeRemoveLockFile();
85 
86  /// Get error message, or "" if there is no error.
87  std::string getErrorMessage() const;
88 
89  /// Set error and error message
90  void setError(const std::error_code &EC, StringRef ErrorMsg = "") {
91  ErrorCode = EC;
92  ErrorDiagMsg = ErrorMsg.str();
93  }
94 };
95 
96 } // end namespace llvm
97 
98 #endif // LLVM_SUPPORT_LOCKFILEMANAGER_H
This class represents lattice values for constants.
Definition: AllocatorList.h:23
WaitForUnlockResult
Describes the result of waiting for the owner to release the lock.
std::string getErrorMessage() const
Get error message, or "" if there is no error.
The lock was released successfully.
void setError(const std::error_code &EC, StringRef ErrorMsg="")
Set error and error message.
An error occurred while trying to create or find the lock file.
std::error_code unsafeRemoveLockFile()
Remove the lock file.
LockFileState getState() const
Determine the state of the lock file.
LockFileState
Describes the state of a lock file.
Reached timeout while waiting for the owner to release the lock.
Owner died while holding the lock.
The lock file has been created and is owned by this instance of the object.
WaitForUnlockResult waitForUnlock()
For a shared lock, wait until the owner releases the lock.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:48
Class that manages the creation of a lock file to aid implicit coordination between different process...
The lock file already exists and is owned by some other instance.