Redesign linked list
All checks were successful
Build documentation / build-and-deploy (push) Successful in 49s

This commit is contained in:
2026-01-06 16:38:42 +01:00
parent d09e4d97ad
commit e50f8940a9
6 changed files with 51 additions and 141 deletions

View File

@@ -11,7 +11,7 @@
/* TODO: figure out a generic way to work with IRQs */
static struct irq* irqs = NULL;
static struct list_node_link* irqs = NULL;
static spin_lock_t irqs_lock;
bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num, uint32_t flags) {
@@ -26,7 +26,7 @@ bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num, uint3
irq->flags = flags;
spin_lock (&irqs_lock);
linklist_append (struct irq*, irqs, irq);
list_append (irqs, &irq->irqs_link);
spin_unlock (&irqs_lock);
#if defined(__x86_64__)
@@ -38,22 +38,26 @@ bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num, uint3
}
void irq_detach (void (*func) (void*, void*)) {
struct list_node_link *irq_link, *irq_link_tmp;
spin_lock (&irqs_lock);
struct irq *irq, *irq_tmp;
linklist_foreach (irqs, irq, irq_tmp) {
list_foreach (irqs, irq_link, irq_link_tmp) {
struct irq* irq = list_entry (irq_link, struct irq, irqs_link);
if ((uintptr_t)irq->func == (uintptr_t)func)
linklist_remove (struct irq*, irqs, irq);
list_remove (irqs, irq_link);
}
spin_unlock (&irqs_lock);
}
struct irq* irq_find (uint32_t irq_num) {
struct list_node_link *irq_link, *irq_link_tmp;
spin_lock (&irqs_lock);
struct irq *irq, *irq_tmp;
linklist_foreach (irqs, irq, irq_tmp) {
list_foreach (irqs, irq_link, irq_link_tmp) {
struct irq* irq = list_entry (irq_link, struct irq, irqs_link);
if (irq->irq_num == irq_num) {
spin_unlock (&irqs_lock);
return irq;

View File

@@ -1,6 +1,7 @@
#ifndef _KERNEL_IRQ_IRQ_H
#define _KERNEL_IRQ_IRQ_H
#include <libk/list.h>
#include <libk/std.h>
#define IRQ_INTERRUPT_SAFE (1 << 0)
@@ -9,7 +10,7 @@
typedef void (*irq_func_t) (void* arg, void* regs);
struct irq {
struct irq* next;
struct list_node_link irqs_link;
irq_func_t func;
void* arg;