1 #ifndef _UTIL_SPINLOCK_H
2 #define _UTIL_SPINLOCK_H
4 // There are two basic lock types: Lock and SpinLock. A thread that
5 // blocks on a Lock may sleep until it obtains the lock. In kernel code,
6 // a thread that blocks on a SpinLock will not sleep, but will run a busy
7 // loop until the lock is freed. In userspace code, a SpinLock behaves
8 // as an ordinary Lock.
11 #include <kern/spinlock.h>
16 #error FIXME -- implement locks for userspace
20 typedef Lock SpinLock;
26 AutoSpinLock(SpinLock &lock) : real_lock(lock)
37 struct DroppableAutoSpinLock {
41 DroppableAutoSpinLock(SpinLock &lock) : real_lock(lock)
47 ~DroppableAutoSpinLock()
68 struct AutoSpinLockIRQ {
71 AutoSpinLockIRQ(SpinLock &lock) : real_lock(lock)
78 real_lock.unlock_irq();
82 struct DroppableAutoSpinLockIRQ {
86 DroppableAutoSpinLockIRQ(SpinLock &lock) : real_lock(lock)
92 ~DroppableAutoSpinLockIRQ()
95 real_lock.unlock_irq();
101 real_lock.lock_irq();
109 real_lock.unlock_irq();
113 struct AutoSpinLockRecIRQ {
117 AutoSpinLockRecIRQ(SpinLock &lock) : real_lock(lock)
119 savedirq = real_lock.lock_recirq();
122 ~AutoSpinLockRecIRQ()
124 real_lock.unlock_recirq(savedirq);
128 struct DroppableAutoSpinLockRecIRQ {
133 DroppableAutoSpinLockRecIRQ(SpinLock &lock) : real_lock(lock)
135 savedirq = real_lock.lock_recirq();
139 ~DroppableAutoSpinLockRecIRQ()
142 real_lock.unlock_recirq(savedirq);
148 savedirq = real_lock.lock_recirq();
156 real_lock.unlock_recirq(savedirq);