2#ifndef POSIX_ADVISORY_LOCK_TABLE_H
3#define POSIX_ADVISORY_LOCK_TABLE_H
8namespace PosixAdvisory {
9constexpr size_t MaximumGrants = 4096;
10constexpr size_t MaximumWaiters = 256;
11constexpr int64_t LastOffset = INT64_MAX;
13enum class OwnerKind {
Process, OpenDescription };
14enum class Namespace { Record, Flock };
15enum class Type { Read, Write, Unlock };
16enum class Result { Success, Conflict, Full };
17enum class RangeResult { Success, Invalid, Overflow };
21 int64_t last = LastOffset;
28 OwnerKind kind = OwnerKind::Process;
29 Namespace name = Namespace::Record;
30 Type type = Type::Unlock;
34RangeResult normalise(
int whence, int64_t start, int64_t length, uint64_t position,
35 uint64_t fileSize,
Range& result);
41 bool conflict(
const Grant& request,
Grant& result)
const;
42 bool query(
const Grant& request,
Grant& result)
const;
44 bool removeOwner(uint64_t owner, uintptr_t inode = 0);
45 bool wouldDeadlock(
const Grant& request,
const Grant*
const* waiters,
size_t waiterCount)
const;
46 size_t count()
const {
49 const Grant& at(
size_t index)
const {
50 return m_Current[index];
54 bool append(
const Grant& grant,
size_t& count);
57 const size_t m_Capacity;