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