Compare commits

...

2 Commits

Author SHA1 Message Date
Drew Galbraith 75b1f2d21c [zion] Store capability ids on the CapabilityTable.
This is preferable to storing it in the capability itself since the id
is really just an index for the containing process.
2023-06-16 15:27:09 -07:00
Drew Galbraith b27672d5de [zion] Update LinkedList iterator semantics. 2023-06-16 15:24:38 -07:00
6 changed files with 26 additions and 24 deletions

View File

@ -10,19 +10,16 @@ class Thread;
class Capability : public RefCounted<Capability> { class Capability : public RefCounted<Capability> {
public: public:
Capability(const RefPtr<KernelObject>& obj, uint64_t id, uint64_t permissions) Capability(const RefPtr<KernelObject>& obj, uint64_t permissions)
: obj_(obj), id_(id), permissions_(permissions) {} : obj_(obj), permissions_(permissions) {}
template <typename T> template <typename T>
Capability(const RefPtr<T>& obj, uint64_t id, uint64_t permissions) Capability(const RefPtr<T>& obj, uint64_t permissions)
: Capability(StaticCastRefPtr<KernelObject>(obj), id, permissions) {} : Capability(StaticCastRefPtr<KernelObject>(obj), permissions) {}
template <typename T> template <typename T>
RefPtr<T> obj(); RefPtr<T> obj();
uint64_t id() { return id_; }
void set_id(uint64_t id) { id_ = id; }
uint64_t permissions() { return permissions_; } uint64_t permissions() { return permissions_; }
bool HasPermissions(uint64_t requested) { bool HasPermissions(uint64_t requested) {
return (permissions_ & requested) == requested; return (permissions_ & requested) == requested;
@ -30,7 +27,6 @@ class Capability : public RefCounted<Capability> {
private: private:
RefPtr<KernelObject> obj_; RefPtr<KernelObject> obj_;
uint64_t id_;
uint64_t permissions_; uint64_t permissions_;
}; };

View File

@ -4,17 +4,17 @@ CapabilityTable::CapabilityTable() {}
uint64_t CapabilityTable::AddExistingCapability(const RefPtr<Capability>& cap) { uint64_t CapabilityTable::AddExistingCapability(const RefPtr<Capability>& cap) {
MutexHolder h(lock_); MutexHolder h(lock_);
cap->set_id(next_cap_id_++); uint64_t id = next_cap_id_++;
capabilities_.PushBack(cap); capabilities_.PushBack({.id = id, .cap = cap});
return cap->id(); return id;
} }
RefPtr<Capability> CapabilityTable::GetCapability(uint64_t id) { RefPtr<Capability> CapabilityTable::GetCapability(uint64_t id) {
MutexHolder h(lock_); MutexHolder h(lock_);
auto iter = capabilities_.begin(); auto iter = capabilities_.begin();
while (iter != capabilities_.end()) { while (iter != capabilities_.end()) {
if (*iter && iter->id() == id) { if (iter->cap && iter->id == id) {
return *iter; return iter->cap;
} }
++iter; ++iter;
} }
@ -27,10 +27,10 @@ RefPtr<Capability> CapabilityTable::ReleaseCapability(uint64_t id) {
MutexHolder h(lock_); MutexHolder h(lock_);
auto iter = capabilities_.begin(); auto iter = capabilities_.begin();
while (iter != capabilities_.end()) { while (iter != capabilities_.end()) {
if (*iter && iter->id() == id) { if (iter->cap && iter->id == id) {
// FIXME: Do an actual release here. // FIXME: Do an actual release here.
auto cap = *iter; auto cap = iter->cap;
*iter = {nullptr}; iter->cap = {nullptr};
return cap; return cap;
} }
++iter; ++iter;

View File

@ -29,7 +29,11 @@ class CapabilityTable {
// FIXME: store this id here rather than in the capability. // FIXME: store this id here rather than in the capability.
uint64_t next_cap_id_ = 0x100; uint64_t next_cap_id_ = 0x100;
// FIXME: use a map data structure. // FIXME: use a map data structure.
LinkedList<RefPtr<Capability>> capabilities_; struct CapEntry {
uint64_t id;
RefPtr<Capability> cap;
};
LinkedList<CapEntry> capabilities_;
}; };
template <typename T> template <typename T>
@ -37,7 +41,8 @@ uint64_t CapabilityTable::AddNewCapability(const RefPtr<T>& object,
uint64_t permissions) { uint64_t permissions) {
MutexHolder h(lock_); MutexHolder h(lock_);
uint64_t id = next_cap_id_++; uint64_t id = next_cap_id_++;
capabilities_.PushBack(MakeRefCounted<Capability>(object, id, permissions)); capabilities_.PushBack(
{.id = id, .cap = MakeRefCounted<Capability>(object, permissions)});
return id; return id;
} }
@ -45,5 +50,6 @@ template <typename T>
void CapabilityTable::AddNewCapabilityWithId(uint64_t id, void CapabilityTable::AddNewCapabilityWithId(uint64_t id,
const RefPtr<T>& object, const RefPtr<T>& object,
uint64_t permissions) { uint64_t permissions) {
capabilities_.PushBack(MakeRefCounted<Capability>(object, id, permissions)); capabilities_.PushBack(
{.id = id, .cap = MakeRefCounted<Capability>(object, permissions)});
} }

View File

@ -88,7 +88,7 @@ class LinkedList {
} }
T& operator*() { return item_->item; } T& operator*() { return item_->item; }
T& operator->() { return item_->item; } T* operator->() { return &item_->item; }
bool operator==(const Iterator& other) { return item_ == other.item_; } bool operator==(const Iterator& other) { return item_ == other.item_; }
bool operator!=(const Iterator& other) { return item_ != other.item_; } bool operator!=(const Iterator& other) { return item_ != other.item_; }

View File

@ -42,7 +42,7 @@ RefPtr<Thread> Process::GetThread(uint64_t tid) {
MutexHolder lock(mutex_); MutexHolder lock(mutex_);
auto iter = threads_.begin(); auto iter = threads_.begin();
while (iter != threads_.end()) { while (iter != threads_.end()) {
if (iter->tid() == tid) { if ((*iter)->tid() == tid) {
return *iter; return *iter;
} }
++iter; ++iter;
@ -55,7 +55,7 @@ void Process::CheckState() {
MutexHolder lock(mutex_); MutexHolder lock(mutex_);
auto iter = threads_.begin(); auto iter = threads_.begin();
while (iter != threads_.end()) { while (iter != threads_.end()) {
if (iter->GetState() != Thread::FINISHED) { if ((*iter)->GetState() != Thread::FINISHED) {
return; return;
} }
++iter; ++iter;

View File

@ -14,7 +14,7 @@ void ProcessManager::InsertProcess(const RefPtr<Process>& proc) {
Process& ProcessManager::FromId(uint64_t pid) { Process& ProcessManager::FromId(uint64_t pid) {
auto iter = proc_list_.begin(); auto iter = proc_list_.begin();
while (iter != proc_list_.end()) { while (iter != proc_list_.end()) {
if (iter->id() == pid) { if ((*iter)->id() == pid) {
return **iter; return **iter;
} }
++iter; ++iter;
@ -28,7 +28,7 @@ void ProcessManager::DumpProcessStates() {
dbgln("Process States: %u", proc_list_.size()); dbgln("Process States: %u", proc_list_.size());
auto iter = proc_list_.begin(); auto iter = proc_list_.begin();
while (iter != proc_list_.end()) { while (iter != proc_list_.end()) {
dbgln("%u: %u", iter->id(), iter->GetState()); dbgln("%u: %u", (*iter)->id(), (*iter)->GetState());
++iter; ++iter;
} }
} }