Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2455 → Rev 2456

/branches/rcu/kernel/arch/ppc32/src/drivers/cuda.c
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);
}