Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2455 → Rev 2456

/branches/rcu/kernel/arch/ia64/src/ski/ski.c
44,6 → 44,7
#include <proc/thread.h>
#include <synch/spinlock.h>
#include <arch/asm.h>
#include <synch/rcu.h>
 
#define SKI_KBD_INR 0
 
142,7 → 143,7
if(ch == '\r')
ch = '\n';
if (ch) {
if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) {
if (rcu_dereference_pointer(ski_kbd_irq.notif_cfg).notify && rcu_dereference_pointer(ski_kbd_irq.notif_cfg).answerbox) {
chardev_push_character(&ski_uconsole, ch);
ipc_irq_send_notif(&ski_kbd_irq);
} else {
155,7 → 156,7
}
 
if (last) {
if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) {
if (rcu_dereference_pointer(ski_kbd_irq.notif_cfg).notify && rcu_dereference_pointer(ski_kbd_irq.notif_cfg).answerbox) {
chardev_push_character(&ski_uconsole, 0);
ipc_irq_send_notif(&ski_kbd_irq);
}
232,9 → 233,9
void ski_kbd_grab(void)
{
ipl_t ipl = interrupts_disable();
spinlock_lock(&ski_kbd_irq.lock);
ski_kbd_irq.notif_cfg.notify = false;
spinlock_unlock(&ski_kbd_irq.lock);
//rcu_read_lock() is not needed, ints are disabled
//rcu: atomic update doesn't need reallocation
rcu_dereference_pointer(ski_kbd_irq.notif_cfg).notify = false;
interrupts_restore(ipl);
}
 
241,9 → 242,10
void ski_kbd_release(void)
{
ipl_t ipl = interrupts_disable();
//rcu: atomic update doesn't need reallocation
spinlock_lock(&ski_kbd_irq.lock);
if (ski_kbd_irq.notif_cfg.answerbox)
ski_kbd_irq.notif_cfg.notify = true;
if (rcu_dereference_pointer(ski_kbd_irq.notif_cfg).answerbox)
rcu_dereference_pointer(ski_kbd_irq.notif_cfg).notify = true;
spinlock_unlock(&ski_kbd_irq.lock);
interrupts_restore(ipl);
}
/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);
}
/branches/rcu/kernel/arch/mips32/src/drivers/serial.c
38,6 → 38,7
#include <arch/drivers/serial.h>
#include <console/chardev.h>
#include <console/console.h>
#include <synch/rcu.h>
 
#define SERIAL_IRQ 2
 
112,7 → 113,7
/** Process keyboard interrupt. Does not work in simics? */
static void serial_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
serial_handler();
/branches/rcu/kernel/arch/mips32/src/drivers/msim.c
39,6 → 39,7
#include <arch/cp0.h>
#include <console/console.h>
#include <sysinfo/sysinfo.h>
#include <synch/rcu.h>
 
/** Address of devices. */
#define MSIM_VIDEORAM 0xB0000000
99,7 → 100,7
/** Process keyboard interrupt. */
static void msim_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 {
char ch = 0;
121,9 → 122,9
void msim_kbd_grab(void)
{
ipl_t ipl = interrupts_disable();
spinlock_lock(&msim_irq.lock);
msim_irq.notif_cfg.notify = false;
spinlock_unlock(&msim_irq.lock);
//rcu_read_lock() is not needed, ints are disabled
//rcu: atomic update doesn't need reallocation
rcu_dereference_pointer(msim_irq.notif_cfg).notify = false;
interrupts_restore(ipl);
}
 
130,9 → 131,10
void msim_kbd_release(void)
{
ipl_t ipl = interrupts_disable();
//rcu: atomic update doesn't need reallocation
spinlock_lock(&msim_irq.lock);
if (msim_irq.notif_cfg.answerbox)
msim_irq.notif_cfg.notify = true;
if (rcu_dereference_pointer(msim_irq.notif_cfg).answerbox)
rcu_dereference_pointer(msim_irq.notif_cfg).notify = true;
spinlock_unlock(&msim_irq.lock);
interrupts_restore(ipl);
}