41,6 → 41,7 |
#include <sysinfo/sysinfo.h> |
#include <interrupt.h> |
#include <stdarg.h> |
#include <synch/rcu.h> |
|
#define CUDA_IRQ 10 |
#define SPECIAL '?' |
249,7 → 250,7 |
|
static void cuda_irq_handler(irq_t *irq, void *arg, ...) |
{ |
if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox)) |
if ((rcu_dereference_pointer(irq->notif_cfg).notify) && (rcu_dereference_pointer(irq->notif_cfg).answerbox)) |
ipc_irq_send_notif(irq); |
else { |
int scan_code = cuda_get_scancode(); |
272,9 → 273,9 |
void cuda_grab(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&cuda_irq.lock); |
cuda_irq.notif_cfg.notify = false; |
spinlock_unlock(&cuda_irq.lock); |
//rcu_read_lock() is not needed, ints are disabled |
//rcu: atomic update doesn't need reallocation |
rcu_dereference_pointer(cuda_irq.notif_cfg).notify = false; |
interrupts_restore(ipl); |
} |
|
283,9 → 284,10 |
void cuda_release(void) |
{ |
ipl_t ipl = interrupts_disable(); |
//rcu: atomic update doesn't need reallocation |
spinlock_lock(&cuda_irq.lock); |
if (cuda_irq.notif_cfg.answerbox) |
cuda_irq.notif_cfg.notify = true; |
if (rcu_dereference_pointer(cuda_irq.notif_cfg).answerbox) |
rcu_dereference_pointer(cuda_irq.notif_cfg).notify = true; |
spinlock_unlock(&cuda_irq.unlock); |
interrupts_restore(ipl); |
} |