LockFileManager.h revision 259065
1149492Stakawata//===--- LockFileManager.h - File-level locking utility ---------*- C++ -*-===//
2149492Stakawata//
3149492Stakawata//                     The LLVM Compiler Infrastructure
4149492Stakawata//
5149492Stakawata// This file is distributed under the University of Illinois Open Source
6149492Stakawata// License. See LICENSE.TXT for details.
7149492Stakawata//
8149492Stakawata//===----------------------------------------------------------------------===//
9149492Stakawata#ifndef LLVM_SUPPORT_LOCKFILEMANAGER_H
10149492Stakawata#define LLVM_SUPPORT_LOCKFILEMANAGER_H
11149492Stakawata
12149492Stakawata#include "llvm/ADT/Optional.h"
13149492Stakawata#include "llvm/ADT/SmallString.h"
14149492Stakawata#include "llvm/ADT/StringRef.h"
15149492Stakawata#include "llvm/Support/system_error.h"
16149492Stakawata#include <utility> // for std::pair
17149492Stakawata
18149492Stakawatanamespace llvm {
19149492Stakawata
20149492Stakawata/// \brief Class that manages the creation of a lock file to aid
21149492Stakawata/// implicit coordination between different processes.
22149492Stakawata///
23149492Stakawata/// The implicit coordination works by creating a ".lock" file alongside
24149492Stakawata/// the file that we're coordinating for, using the atomicity of the file
25149492Stakawata/// system to ensure that only a single process can create that ".lock" file.
26149492Stakawata/// When the lock file is removed, the owning process has finished the
27149492Stakawata/// operation.
28149492Stakawataclass LockFileManager {
29149492Stakawatapublic:
30149492Stakawata  /// \brief Describes the state of a lock file.
31149492Stakawata  enum LockFileState {
32149492Stakawata    /// \brief The lock file has been created and is owned by this instance
33149492Stakawata    /// of the object.
34149492Stakawata    LFS_Owned,
35149492Stakawata    /// \brief The lock file already exists and is owned by some other
36149492Stakawata    /// instance.
37149492Stakawata    LFS_Shared,
38247662Sattilio    /// \brief An error occurred while trying to create or find the lock
39247662Sattilio    /// file.
40247662Sattilio    LFS_Error
41247662Sattilio  };
42149492Stakawata
43149492Stakawataprivate:
44247662Sattilio  SmallString<128> FileName;
45247662Sattilio  SmallString<128> LockFileName;
46247662Sattilio  SmallString<128> UniqueLockFileName;
47247662Sattilio
48247662Sattilio  Optional<std::pair<std::string, int> > Owner;
49247662Sattilio  Optional<error_code> Error;
50247662Sattilio
51247662Sattilio  LockFileManager(const LockFileManager &) LLVM_DELETED_FUNCTION;
52247662Sattilio  LockFileManager &operator=(const LockFileManager &) LLVM_DELETED_FUNCTION;
53247662Sattilio
54247662Sattilio  static Optional<std::pair<std::string, int> >
55247662Sattilio  readLockFile(StringRef LockFileName);
56247662Sattilio
57247662Sattilio  static bool processStillExecuting(StringRef Hostname, int PID);
58247837Sdumbbell
59149492Stakawatapublic:
60247662Sattilio
61247662Sattilio  LockFileManager(StringRef FileName);
62247662Sattilio  ~LockFileManager();
63247662Sattilio
64247662Sattilio  /// \brief Determine the state of the lock file.
65247662Sattilio  LockFileState getState() const;
66247662Sattilio
67247662Sattilio  operator LockFileState() const { return getState(); }
68247662Sattilio
69247662Sattilio  /// \brief For a shared lock, wait until the owner releases the lock.
70247662Sattilio  void waitForUnlock();
71247662Sattilio};
72247662Sattilio
73247837Sdumbbell} // end namespace llvm
74247662Sattilio
75247662Sattilio#endif // LLVM_SUPPORT_LOCKFILEMANAGER_H
76247662Sattilio