The Pedigree Project 0.1
advisory-lock-state.h
1/* Copyright (c) 2026, Pedigree Developers. */
2#ifndef POSIX_ADVISORY_LOCK_STATE_H
3#define POSIX_ADVISORY_LOCK_STATE_H
4
5#include "pedigree/kernel/compiler.h"
6#include "pedigree/kernel/processor/types.h"
7
8#include "advisory-lock-table.h"
9
10class EXPORTED_PUBLIC AdvisoryOwner {
11 public:
12 using Kind = PosixAdvisory::OwnerKind;
13 explicit AdvisoryOwner(Kind kind);
14 ~AdvisoryOwner() = default;
15 AdvisoryOwner(const AdvisoryOwner&) = delete;
16 AdvisoryOwner& operator=(const AdvisoryOwner&) = delete;
17 uint64_t identity() const {
18 return m_Id;
19 }
20
21 private:
22 friend class PosixAdvisoryLocks;
23 enum State : uint8_t { Unused, Open, Closed };
24 const uint64_t m_Id;
25 const Kind m_Kind;
26 uint8_t m_State = Unused;
27};
28
29void posix_advisory_descriptor_closed(AdvisoryOwner& owner, uintptr_t inodeIdentity);
30void posix_advisory_owner_closed(AdvisoryOwner& owner);
31
32// Admission is only the short fd/OFD identity check; it cannot take an OFD lock.
33using PosixAdvisoryAdmission = bool (*)(void* context);
34int posix_advisory_apply(AdvisoryOwner& owner, PosixAdvisory::Grant request, bool wait,
35 PosixAdvisoryAdmission admission = nullptr, void* context = nullptr);
36int posix_advisory_query(AdvisoryOwner& owner, PosixAdvisory::Grant request,
37 PosixAdvisory::Grant& conflict, bool& found);
38
39#endif