5export module zxfoundation.scoms.kobject.types;
6import zxfoundation.base.types;
7import zxfoundation.base.typestate;
12namespace zxfoundation::scoms::kobject {
14 using base::lifecycle_state;
16 using std::memory_order;
19 inline constexpr u32 KOBJECT_ID_INVALID = ~0U;
22 enum class kobject_type : u8 {
52 [[nodiscard]]
constexpr auto kobject_type_name(kobject::kobject_type t)
noexcept
56 case kobject::kobject_type::none:
return "none";
57 case kobject::kobject_type::domain:
return "domain";
58 case kobject::kobject_type::gate:
return "gate";
59 case kobject::kobject_type::portal:
return "portal";
60 case kobject::kobject_type::vm_region:
return "vm_region";
61 case kobject::kobject_type::io_binding:
return "io_binding";
62 case kobject::kobject_type::capability:
return "capability";
63 case kobject::kobject_type::strand:
return "strand";
64 case kobject::kobject_type::irq_desc:
return "irq_desc";
65 case kobject::kobject_type::memory_resource:
return "memory_resource";
66 case kobject::kobject_type::memory_extent:
return "memory_extent";
67 case kobject::kobject_type::memory_folio:
return "memory_folio";
68 case kobject::kobject_type::page:
return "page";
69 case kobject::kobject_type::storage:
return "storage";
70 case kobject::kobject_type::grant:
return "grant";
71 case kobject::kobject_type::mapping:
return "mapping";
72 case kobject::kobject_type::address_space:
return "address_space";
73 case kobject::kobject_type::page_table:
return "page_table";
74 case kobject::kobject_type::key:
return "key";
75 case kobject::kobject_type::endpoint:
return "endpoint";
76 case kobject::kobject_type::message:
return "message";
77 case kobject::kobject_type::kmem_cache:
return "kmem_cache";
78 case kobject::kobject_type::policy_server:
return "policy_server";
79 case kobject::kobject_type::service_entry:
return "service_entry";
80 case kobject::kobject_type::device_binding:
return "device_binding";
81 case kobject::kobject_type::dataset_extent:
return "dataset_extent";
82 default:
return "unknown";
92 [[nodiscard]]
auto try_get()
noexcept ->
bool {
93 u32 current = count.load(memory_order::acquire);
95 if (current == 0U)
return false;
96 if (current >= 0x7FFF'FFFEU) [[unlikely]] __builtin_trap();
97 if (count.compare_exchange_weak(
98 current,
static_cast<u32>(current + 1U),
99 memory_order::acq_rel, memory_order::acquire)) {
107 [[nodiscard]]
auto put()
noexcept ->
bool {
108 const u32 prev = count.fetch_sub(1U, memory_order::release);
109 if (prev == 0U) [[unlikely]] {
113 atomic<u32> fence_dummy{0};
114 discard_value fence_dummy.load(memory_order::acquire);
121 [[nodiscard]]
auto read()
const noexcept -> u32 {
122 return count.load(memory_order::relaxed);
126 [[nodiscard]]
auto is_one()
const noexcept ->
bool {
127 return count.load(memory_order::acquire) == 1U;
131 static_assert(
sizeof(kref) == 4,
"kref must be exactly 4 bytes");