diff --git a/zion/capability/capability.h b/zion/capability/capability.h index 2277dc0..dc2cbec 100644 --- a/zion/capability/capability.h +++ b/zion/capability/capability.h @@ -10,19 +10,16 @@ class Thread; class Capability : public RefCounted { public: - Capability(const RefPtr& obj, uint64_t id, uint64_t permissions) - : obj_(obj), id_(id), permissions_(permissions) {} + Capability(const RefPtr& obj, uint64_t permissions) + : obj_(obj), permissions_(permissions) {} template - Capability(const RefPtr& obj, uint64_t id, uint64_t permissions) - : Capability(StaticCastRefPtr(obj), id, permissions) {} + Capability(const RefPtr& obj, uint64_t permissions) + : Capability(StaticCastRefPtr(obj), permissions) {} template RefPtr obj(); - uint64_t id() { return id_; } - void set_id(uint64_t id) { id_ = id; } - uint64_t permissions() { return permissions_; } bool HasPermissions(uint64_t requested) { return (permissions_ & requested) == requested; @@ -30,7 +27,6 @@ class Capability : public RefCounted { private: RefPtr obj_; - uint64_t id_; uint64_t permissions_; }; diff --git a/zion/capability/capability_table.cpp b/zion/capability/capability_table.cpp index e157508..48b5910 100644 --- a/zion/capability/capability_table.cpp +++ b/zion/capability/capability_table.cpp @@ -4,17 +4,17 @@ CapabilityTable::CapabilityTable() {} uint64_t CapabilityTable::AddExistingCapability(const RefPtr& cap) { MutexHolder h(lock_); - cap->set_id(next_cap_id_++); - capabilities_.PushBack(cap); - return cap->id(); + uint64_t id = next_cap_id_++; + capabilities_.PushBack({.id = id, .cap = cap}); + return id; } RefPtr CapabilityTable::GetCapability(uint64_t id) { MutexHolder h(lock_); auto iter = capabilities_.begin(); while (iter != capabilities_.end()) { - if (*iter && (*iter)->id() == id) { - return *iter; + if (iter->cap && iter->id == id) { + return iter->cap; } ++iter; } @@ -27,10 +27,10 @@ RefPtr CapabilityTable::ReleaseCapability(uint64_t id) { MutexHolder h(lock_); auto iter = capabilities_.begin(); while (iter != capabilities_.end()) { - if (*iter && (*iter)->id() == id) { + if (iter->cap && iter->id == id) { // FIXME: Do an actual release here. - auto cap = *iter; - *iter = {nullptr}; + auto cap = iter->cap; + iter->cap = {nullptr}; return cap; } ++iter; diff --git a/zion/capability/capability_table.h b/zion/capability/capability_table.h index 3c9d306..0096523 100644 --- a/zion/capability/capability_table.h +++ b/zion/capability/capability_table.h @@ -29,7 +29,11 @@ class CapabilityTable { // FIXME: store this id here rather than in the capability. uint64_t next_cap_id_ = 0x100; // FIXME: use a map data structure. - LinkedList> capabilities_; + struct CapEntry { + uint64_t id; + RefPtr cap; + }; + LinkedList capabilities_; }; template @@ -37,7 +41,8 @@ uint64_t CapabilityTable::AddNewCapability(const RefPtr& object, uint64_t permissions) { MutexHolder h(lock_); uint64_t id = next_cap_id_++; - capabilities_.PushBack(MakeRefCounted(object, id, permissions)); + capabilities_.PushBack( + {.id = id, .cap = MakeRefCounted(object, permissions)}); return id; } @@ -45,5 +50,6 @@ template void CapabilityTable::AddNewCapabilityWithId(uint64_t id, const RefPtr& object, uint64_t permissions) { - capabilities_.PushBack(MakeRefCounted(object, id, permissions)); + capabilities_.PushBack( + {.id = id, .cap = MakeRefCounted(object, permissions)}); }