15ffd83dbSDimitry Andric //===-- LockFilePosix.cpp -------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andric #include "lldb/Host/posix/LockFilePosix.h"
100b57cec5SDimitry Andric
110b57cec5SDimitry Andric #include "llvm/Support/Errno.h"
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric #include <fcntl.h>
140b57cec5SDimitry Andric #include <unistd.h>
150b57cec5SDimitry Andric
160b57cec5SDimitry Andric using namespace lldb;
170b57cec5SDimitry Andric using namespace lldb_private;
180b57cec5SDimitry Andric
fileLock(int fd,int cmd,int lock_type,const uint64_t start,const uint64_t len)19*349cc55cSDimitry Andric static Status fileLock(int fd, int cmd, int lock_type, const uint64_t start,
200b57cec5SDimitry Andric const uint64_t len) {
210b57cec5SDimitry Andric struct flock fl;
220b57cec5SDimitry Andric
230b57cec5SDimitry Andric fl.l_type = lock_type;
240b57cec5SDimitry Andric fl.l_whence = SEEK_SET;
250b57cec5SDimitry Andric fl.l_start = start;
260b57cec5SDimitry Andric fl.l_len = len;
270b57cec5SDimitry Andric fl.l_pid = ::getpid();
280b57cec5SDimitry Andric
290b57cec5SDimitry Andric Status error;
300b57cec5SDimitry Andric if (llvm::sys::RetryAfterSignal(-1, ::fcntl, fd, cmd, &fl) == -1)
310b57cec5SDimitry Andric error.SetErrorToErrno();
320b57cec5SDimitry Andric
330b57cec5SDimitry Andric return error;
340b57cec5SDimitry Andric }
350b57cec5SDimitry Andric
LockFilePosix(int fd)360b57cec5SDimitry Andric LockFilePosix::LockFilePosix(int fd) : LockFileBase(fd) {}
370b57cec5SDimitry Andric
~LockFilePosix()380b57cec5SDimitry Andric LockFilePosix::~LockFilePosix() { Unlock(); }
390b57cec5SDimitry Andric
DoWriteLock(const uint64_t start,const uint64_t len)400b57cec5SDimitry Andric Status LockFilePosix::DoWriteLock(const uint64_t start, const uint64_t len) {
410b57cec5SDimitry Andric return fileLock(m_fd, F_SETLKW, F_WRLCK, start, len);
420b57cec5SDimitry Andric }
430b57cec5SDimitry Andric
DoTryWriteLock(const uint64_t start,const uint64_t len)440b57cec5SDimitry Andric Status LockFilePosix::DoTryWriteLock(const uint64_t start, const uint64_t len) {
450b57cec5SDimitry Andric return fileLock(m_fd, F_SETLK, F_WRLCK, start, len);
460b57cec5SDimitry Andric }
470b57cec5SDimitry Andric
DoReadLock(const uint64_t start,const uint64_t len)480b57cec5SDimitry Andric Status LockFilePosix::DoReadLock(const uint64_t start, const uint64_t len) {
490b57cec5SDimitry Andric return fileLock(m_fd, F_SETLKW, F_RDLCK, start, len);
500b57cec5SDimitry Andric }
510b57cec5SDimitry Andric
DoTryReadLock(const uint64_t start,const uint64_t len)520b57cec5SDimitry Andric Status LockFilePosix::DoTryReadLock(const uint64_t start, const uint64_t len) {
530b57cec5SDimitry Andric return fileLock(m_fd, F_SETLK, F_RDLCK, start, len);
540b57cec5SDimitry Andric }
550b57cec5SDimitry Andric
DoUnlock()560b57cec5SDimitry Andric Status LockFilePosix::DoUnlock() {
570b57cec5SDimitry Andric return fileLock(m_fd, F_SETLK, F_UNLCK, m_start, m_len);
580b57cec5SDimitry Andric }
59