180814287SRaphael Isemann //===-- LockFilePosix.cpp -------------------------------------------------===//
2919ef9dcSOleksiy Vyalov //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6919ef9dcSOleksiy Vyalov //
7919ef9dcSOleksiy Vyalov //===----------------------------------------------------------------------===//
8919ef9dcSOleksiy Vyalov 
9919ef9dcSOleksiy Vyalov #include "lldb/Host/posix/LockFilePosix.h"
10919ef9dcSOleksiy Vyalov 
112819136fSMichal Gorny #include "llvm/Support/Errno.h"
122819136fSMichal Gorny 
13919ef9dcSOleksiy Vyalov #include <fcntl.h>
14b6dbe9a9SPavel Labath #include <unistd.h>
15919ef9dcSOleksiy Vyalov 
16919ef9dcSOleksiy Vyalov using namespace lldb;
17919ef9dcSOleksiy Vyalov using namespace lldb_private;
18919ef9dcSOleksiy Vyalov 
fileLock(int fd,int cmd,int lock_type,const uint64_t start,const uint64_t len)19*93c1b3caSPavel Labath static Status fileLock(int fd, int cmd, int lock_type, const uint64_t start,
20b9c1b51eSKate Stone                        const uint64_t len) {
21919ef9dcSOleksiy Vyalov   struct flock fl;
22919ef9dcSOleksiy Vyalov 
23919ef9dcSOleksiy Vyalov   fl.l_type = lock_type;
24919ef9dcSOleksiy Vyalov   fl.l_whence = SEEK_SET;
25919ef9dcSOleksiy Vyalov   fl.l_start = start;
26919ef9dcSOleksiy Vyalov   fl.l_len = len;
27919ef9dcSOleksiy Vyalov   fl.l_pid = ::getpid();
28919ef9dcSOleksiy Vyalov 
2997206d57SZachary Turner   Status error;
302819136fSMichal Gorny   if (llvm::sys::RetryAfterSignal(-1, ::fcntl, fd, cmd, &fl) == -1)
31919ef9dcSOleksiy Vyalov     error.SetErrorToErrno();
32919ef9dcSOleksiy Vyalov 
33919ef9dcSOleksiy Vyalov   return error;
34919ef9dcSOleksiy Vyalov }
35919ef9dcSOleksiy Vyalov 
LockFilePosix(int fd)36b9c1b51eSKate Stone LockFilePosix::LockFilePosix(int fd) : LockFileBase(fd) {}
37919ef9dcSOleksiy Vyalov 
~LockFilePosix()38b9c1b51eSKate Stone LockFilePosix::~LockFilePosix() { Unlock(); }
39919ef9dcSOleksiy Vyalov 
DoWriteLock(const uint64_t start,const uint64_t len)4097206d57SZachary Turner Status LockFilePosix::DoWriteLock(const uint64_t start, const uint64_t len) {
41919ef9dcSOleksiy Vyalov   return fileLock(m_fd, F_SETLKW, F_WRLCK, start, len);
42919ef9dcSOleksiy Vyalov }
43919ef9dcSOleksiy Vyalov 
DoTryWriteLock(const uint64_t start,const uint64_t len)4497206d57SZachary Turner Status LockFilePosix::DoTryWriteLock(const uint64_t start, const uint64_t len) {
45919ef9dcSOleksiy Vyalov   return fileLock(m_fd, F_SETLK, F_WRLCK, start, len);
46919ef9dcSOleksiy Vyalov }
47919ef9dcSOleksiy Vyalov 
DoReadLock(const uint64_t start,const uint64_t len)4897206d57SZachary Turner Status LockFilePosix::DoReadLock(const uint64_t start, const uint64_t len) {
49919ef9dcSOleksiy Vyalov   return fileLock(m_fd, F_SETLKW, F_RDLCK, start, len);
50919ef9dcSOleksiy Vyalov }
51919ef9dcSOleksiy Vyalov 
DoTryReadLock(const uint64_t start,const uint64_t len)5297206d57SZachary Turner Status LockFilePosix::DoTryReadLock(const uint64_t start, const uint64_t len) {
53919ef9dcSOleksiy Vyalov   return fileLock(m_fd, F_SETLK, F_RDLCK, start, len);
54919ef9dcSOleksiy Vyalov }
55919ef9dcSOleksiy Vyalov 
DoUnlock()5697206d57SZachary Turner Status LockFilePosix::DoUnlock() {
57919ef9dcSOleksiy Vyalov   return fileLock(m_fd, F_SETLK, F_UNLCK, m_start, m_len);
58919ef9dcSOleksiy Vyalov }
59