Use vector instead of hashmap

This commit is contained in:
Alex 2023-02-27 17:36:18 +02:00
parent 7b756263c0
commit c4a2f645de
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD

View File

@ -1,7 +1,7 @@
#include <interrupts.hpp> #include <interrupts.hpp>
#include <syscalls.hpp> #include <syscalls.hpp>
#include <hashmap.hpp> #include <vector.hpp>
#include <smp.hpp> #include <smp.hpp>
#include <io.h> #include <io.h>
@ -23,7 +23,12 @@ extern "C" SafeFunction void ExceptionHandler(void *Data) { CrashHandler::Handle
namespace Interrupts namespace Interrupts
{ {
HashMap<int, uint64_t> *RegisteredEvents; struct Event
{
int ID;
void *Data;
};
Vector<Event> RegisteredEvents;
#if defined(__amd64__) #if defined(__amd64__)
/* APIC::APIC */ void *apic[MAX_CPU]; /* APIC::APIC */ void *apic[MAX_CPU];
@ -36,10 +41,6 @@ namespace Interrupts
void Initialize(int Core) void Initialize(int Core)
{ {
static int once = 0;
if (!once++)
RegisteredEvents = new HashMap<int, uint64_t>;
#if defined(__amd64__) #if defined(__amd64__)
GlobalDescriptorTable::Init(Core); GlobalDescriptorTable::Init(Core);
InterruptDescriptorTable::Init(Core); InterruptDescriptorTable::Init(Core);
@ -107,8 +108,7 @@ namespace Interrupts
SafeFunction void RemoveAll() SafeFunction void RemoveAll()
{ {
for (int i = 0; i < CPU::x86::IRQ223; i++) RegisteredEvents.clear();
RegisteredEvents->DeleteNode(i);
} }
extern "C" SafeFunction void MainInterruptHandler(void *Data) extern "C" SafeFunction void MainInterruptHandler(void *Data)
@ -130,8 +130,18 @@ namespace Interrupts
if (Frame->InterruptNumber == CPU::x86::IRQ29) // Halt core interrupt if (Frame->InterruptNumber == CPU::x86::IRQ29) // Halt core interrupt
CPU::Stop(); CPU::Stop();
Handler *handler = (Handler *)RegisteredEvents->Get(Frame->InterruptNumber); Handler *handler = nullptr;
if (likely(handler != (Handler *)HASHMAP_ERROR))
foreach (auto var in RegisteredEvents)
{
if (var.ID == static_cast<int>(Frame->InterruptNumber))
{
handler = (Handler *)var.Data;
break;
}
}
if (handler != nullptr)
handler->OnInterruptReceived(Frame); handler->OnInterruptReceived(Frame);
else else
{ {
@ -162,22 +172,31 @@ namespace Interrupts
Handler::Handler(int InterruptNumber) Handler::Handler(int InterruptNumber)
{ {
if (RegisteredEvents->Get(InterruptNumber) != (uint64_t)HASHMAP_ERROR) foreach (auto var in RegisteredEvents)
{ {
warn("IRQ%d is already registered.", InterruptNumber - 32); if (var.ID == InterruptNumber)
return; {
warn("IRQ%d is already registered.", InterruptNumber - 32);
}
} }
debug("Registering interrupt handler for IRQ%d.", InterruptNumber - 32); debug("Registering interrupt handler for IRQ%d.", InterruptNumber - 32);
this->InterruptNumber = InterruptNumber; this->InterruptNumber = InterruptNumber;
RegisteredEvents->AddNode(InterruptNumber, (uint64_t)this); RegisteredEvents.push_back({InterruptNumber, this});
} }
Handler::~Handler() Handler::~Handler()
{ {
debug("Unregistering interrupt handler for IRQ%d.", InterruptNumber - 32); debug("Unregistering interrupt handler for IRQ%d.", InterruptNumber - 32);
if (RegisteredEvents->DeleteNode(InterruptNumber) == (uint64_t)HASHMAP_ERROR) for (size_t i = 0; i < RegisteredEvents.size(); i++)
warn("Node %d not found.", InterruptNumber); {
if (RegisteredEvents[i].ID == InterruptNumber)
{
RegisteredEvents.remove(i);
return;
}
}
warn("Event %d not found.", InterruptNumber);
} }
#if defined(__amd64__) #if defined(__amd64__)