Use RW spin locks
All checks were successful
Build documentation / build-and-deploy (push) Successful in 39s
All checks were successful
Build documentation / build-and-deploy (push) Successful in 39s
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
#include <libk/list.h>
|
||||
#include <libk/std.h>
|
||||
#include <mm/liballoc.h>
|
||||
#include <sync/spin_lock.h>
|
||||
#include <sync/rw_spin_lock.h>
|
||||
|
||||
#if defined(__x86_64__)
|
||||
#include <amd64/apic.h>
|
||||
@@ -12,7 +12,7 @@
|
||||
/* TODO: figure out a generic way to work with IRQs */
|
||||
|
||||
static struct list_node_link* irqs = NULL;
|
||||
static spin_lock_t irqs_lock;
|
||||
static rw_spin_lock_t irqs_lock;
|
||||
|
||||
bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num, uint32_t flags) {
|
||||
struct irq* irq = malloc (sizeof (*irq));
|
||||
@@ -25,9 +25,9 @@ bool irq_attach (void (*func) (void*, void*), void* arg, uint32_t irq_num, uint3
|
||||
irq->irq_num = irq_num;
|
||||
irq->flags = flags;
|
||||
|
||||
spin_lock (&irqs_lock);
|
||||
rw_spin_write_lock (&irqs_lock);
|
||||
list_append (irqs, &irq->irqs_link);
|
||||
spin_unlock (&irqs_lock);
|
||||
rw_spin_write_unlock (&irqs_lock);
|
||||
|
||||
#if defined(__x86_64__)
|
||||
uint8_t resolution = amd64_resolve_irq (irq_num);
|
||||
@@ -39,32 +39,40 @@ 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 = NULL;
|
||||
|
||||
rw_spin_read_lock (&irqs_lock);
|
||||
|
||||
list_foreach (irqs, irq_link, irq_link_tmp) {
|
||||
struct irq* irq = list_entry (irq_link, struct irq, irqs_link);
|
||||
irq = list_entry (irq_link, struct irq, irqs_link);
|
||||
|
||||
if ((uintptr_t)irq->func == (uintptr_t)func)
|
||||
list_remove (irqs, irq_link);
|
||||
break;
|
||||
}
|
||||
|
||||
spin_unlock (&irqs_lock);
|
||||
rw_spin_read_unlock (&irqs_lock);
|
||||
|
||||
if (irq != NULL) {
|
||||
rw_spin_write_lock (&irqs_lock);
|
||||
list_remove (irqs, &irq->irqs_link);
|
||||
rw_spin_write_unlock (&irqs_lock);
|
||||
}
|
||||
}
|
||||
|
||||
struct irq* irq_find (uint32_t irq_num) {
|
||||
struct list_node_link *irq_link, *irq_link_tmp;
|
||||
spin_lock (&irqs_lock);
|
||||
rw_spin_read_lock (&irqs_lock);
|
||||
|
||||
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);
|
||||
rw_spin_read_unlock (&irqs_lock);
|
||||
return irq;
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock (&irqs_lock);
|
||||
rw_spin_read_unlock (&irqs_lock);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user