LockFilePosix.cpp revision 287506
1//===-- LockFilePosix.cpp ---------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Host/posix/LockFilePosix.h"
11
12#include <fcntl.h>
13
14using namespace lldb;
15using namespace lldb_private;
16
17namespace
18{
19
20Error fileLock (int fd, int cmd, int lock_type, const uint64_t start, const uint64_t len)
21{
22    struct flock fl;
23
24    fl.l_type   = lock_type;
25    fl.l_whence = SEEK_SET;
26    fl.l_start  = start;
27    fl.l_len    = len;
28    fl.l_pid    = ::getpid ();
29
30    Error error;
31    if (::fcntl (fd, cmd, &fl) == -1)
32        error.SetErrorToErrno ();
33
34    return error;
35}
36
37}  // namespace
38
39LockFilePosix::LockFilePosix (int fd)
40    : LockFileBase (fd)
41{
42}
43
44LockFilePosix::~LockFilePosix ()
45{
46    Unlock ();
47}
48
49Error
50LockFilePosix::DoWriteLock (const uint64_t start, const uint64_t len)
51{
52    return fileLock (m_fd, F_SETLKW, F_WRLCK, start, len);
53}
54
55Error
56LockFilePosix::DoTryWriteLock (const uint64_t start, const uint64_t len)
57{
58    return fileLock (m_fd, F_SETLK, F_WRLCK, start, len);
59}
60
61Error
62LockFilePosix::DoReadLock (const uint64_t start, const uint64_t len)
63{
64    return fileLock (m_fd, F_SETLKW, F_RDLCK, start, len);
65}
66
67Error
68LockFilePosix::DoTryReadLock (const uint64_t start, const uint64_t len)
69{
70    return fileLock (m_fd, F_SETLK, F_RDLCK, start, len);
71}
72
73Error
74LockFilePosix::DoUnlock ()
75{
76    return fileLock (m_fd, F_SETLK, F_UNLCK, m_start, m_len);
77}
78