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