1285101Semaste//===-- LockFilePosix.cpp ---------------------------------------*- C++ -*-===// 2285101Semaste// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6285101Semaste// 7285101Semaste//===----------------------------------------------------------------------===// 8285101Semaste 9285101Semaste#include "lldb/Host/posix/LockFilePosix.h" 10285101Semaste 11353358Sdim#include "llvm/Support/Errno.h" 12353358Sdim 13285101Semaste#include <fcntl.h> 14321369Sdim#include <unistd.h> 15285101Semaste 16285101Semasteusing namespace lldb; 17285101Semasteusing namespace lldb_private; 18285101Semaste 19314564Sdimnamespace { 20285101Semaste 21321369SdimStatus fileLock(int fd, int cmd, int lock_type, const uint64_t start, 22321369Sdim const uint64_t len) { 23314564Sdim struct flock fl; 24285101Semaste 25314564Sdim fl.l_type = lock_type; 26314564Sdim fl.l_whence = SEEK_SET; 27314564Sdim fl.l_start = start; 28314564Sdim fl.l_len = len; 29314564Sdim fl.l_pid = ::getpid(); 30285101Semaste 31321369Sdim Status error; 32353358Sdim if (llvm::sys::RetryAfterSignal(-1, ::fcntl, fd, cmd, &fl) == -1) 33314564Sdim error.SetErrorToErrno(); 34285101Semaste 35314564Sdim return error; 36285101Semaste} 37285101Semaste 38314564Sdim} // namespace 39285101Semaste 40314564SdimLockFilePosix::LockFilePosix(int fd) : LockFileBase(fd) {} 41285101Semaste 42314564SdimLockFilePosix::~LockFilePosix() { Unlock(); } 43285101Semaste 44321369SdimStatus LockFilePosix::DoWriteLock(const uint64_t start, const uint64_t len) { 45314564Sdim return fileLock(m_fd, F_SETLKW, F_WRLCK, start, len); 46285101Semaste} 47285101Semaste 48321369SdimStatus LockFilePosix::DoTryWriteLock(const uint64_t start, const uint64_t len) { 49314564Sdim return fileLock(m_fd, F_SETLK, F_WRLCK, start, len); 50285101Semaste} 51285101Semaste 52321369SdimStatus LockFilePosix::DoReadLock(const uint64_t start, const uint64_t len) { 53314564Sdim return fileLock(m_fd, F_SETLKW, F_RDLCK, start, len); 54285101Semaste} 55285101Semaste 56321369SdimStatus LockFilePosix::DoTryReadLock(const uint64_t start, const uint64_t len) { 57314564Sdim return fileLock(m_fd, F_SETLK, F_RDLCK, start, len); 58285101Semaste} 59285101Semaste 60321369SdimStatus LockFilePosix::DoUnlock() { 61314564Sdim return fileLock(m_fd, F_SETLK, F_UNLCK, m_start, m_len); 62285101Semaste} 63