diff --git a/zion/debug/debug.h b/zion/debug/debug.h index 567bf79..ed07d9a 100644 --- a/zion/debug/debug.h +++ b/zion/debug/debug.h @@ -28,6 +28,12 @@ void panic(const char* str, Args... args) { asm volatile("cli; hlt;"); } +#define PANIC_ON_ERR(expr, str) \ + { \ + if (expr != glcr::OK) { \ + panic(str); \ + } \ + } #define UNREACHABLE \ panic("Unreachable {}, {}", __FILE__, __LINE__); \ __builtin_unreachable(); diff --git a/zion/scheduler/process_manager.cpp b/zion/scheduler/process_manager.cpp index 3291a81..1390615 100644 --- a/zion/scheduler/process_manager.cpp +++ b/zion/scheduler/process_manager.cpp @@ -10,19 +10,12 @@ void ProcessManager::Init() { } void ProcessManager::InsertProcess(const glcr::RefPtr& proc) { - proc_list_.PushBack(proc); + PANIC_ON_ERR(proc_map_.Insert(proc->id(), proc), "Reinserting process"); } Process& ProcessManager::FromId(uint64_t pid) { - if (pid >= proc_list_.size()) { - panic("Bad proc access {}, have {} processes", pid, proc_list_.size()); - } - return *proc_list_[pid]; -} - -void ProcessManager::DumpProcessStates() { - dbgln("Process States: {}", proc_list_.size()); - for (uint64_t i = 0; i < proc_list_.size(); i++) { - dbgln("{}: {}", proc_list_[i]->id(), (uint64_t)proc_list_[i]->GetState()); + if (!proc_map_.Contains(pid)) { + panic("Bad proc access {}, have {} processes", pid, proc_map_.size()); } + return *proc_map_.at(pid); } diff --git a/zion/scheduler/process_manager.h b/zion/scheduler/process_manager.h index 509ecd3..9efbaa9 100644 --- a/zion/scheduler/process_manager.h +++ b/zion/scheduler/process_manager.h @@ -14,11 +14,8 @@ class ProcessManager { void InsertProcess(const glcr::RefPtr& proc); Process& FromId(uint64_t id); - void DumpProcessStates(); - private: - // TODO: This should be a hashmap. - glcr::Vector> proc_list_; + glcr::HashMap> proc_map_; }; extern ProcessManager* gProcMan;