4 typedef struct spinlock {
7 #ifdef SUPPORT_SPINLOCK_ISR
14 KLOCK_QUEUE_HANDLE lockh;
18 #ifdef SUPPORT_SPINLOCK_ISR
22 IN spinlock_t* const l,
23 IN PKINTERRUPT p_int_obj )
26 l->p_int_obj = p_int_obj;
29 static inline void spin_lock_isr_init(
30 IN spinlock_t* const l,
31 IN PKINTERRUPT int_obj
34 KeInitializeSpinLock( &l->lock );
35 l->p_int_obj = int_obj;
38 static inline unsigned long
40 IN spinlock_t* const l)
43 MT_ASSERT( l->p_int_obj );
44 return (unsigned long)(l->irql = KeAcquireInterruptSpinLock ( l->p_int_obj ));
49 IN spinlock_t* const p_spinlock )
51 MT_ASSERT( p_spinlock );
52 MT_ASSERT( p_spinlock->p_int_obj );
53 KeReleaseInterruptSpinLock ( p_spinlock->p_int_obj, p_spinlock->irql );
58 #define SPIN_LOCK_PREP(lh) spinlockh_t lh
60 static inline void spin_lock_init(
61 IN spinlock_t* const p_spinlock )
63 KeInitializeSpinLock( &p_spinlock->lock );
68 IN spinlock_t* const l,
69 IN spinlockh_t * const lh)
71 KIRQL irql = KeGetCurrentIrql();
74 ASSERT(irql <= DISPATCH_LEVEL);
76 if (irql == DISPATCH_LEVEL)
77 KeAcquireInStackQueuedSpinLockAtDpcLevel( &l->lock, &lh->lockh );
79 KeAcquireInStackQueuedSpinLock( &l->lock, &lh->lockh );
85 IN spinlockh_t * const lh)
88 ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
89 if (lh->irql == DISPATCH_LEVEL)
90 KeReleaseInStackQueuedSpinLockFromDpcLevel( &lh->lockh );
92 KeReleaseInStackQueuedSpinLock( &lh->lockh );
97 IN spinlock_t* const l )
99 KLOCK_QUEUE_HANDLE lockh;
101 ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
102 KeAcquireInStackQueuedSpinLock ( &l->lock, &lockh );
103 KeReleaseInStackQueuedSpinLock( &lockh );
106 /* to be used only at DPC level */
109 IN spinlock_t* const l,
110 IN spinlockh_t * const lh)
112 MT_ASSERT( l || lh );
113 ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
114 KeAcquireInStackQueuedSpinLockAtDpcLevel( &l->lock, &lh->lockh );
117 /* to be used only at DPC level */
120 IN spinlockh_t * const lh)
122 ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
123 KeReleaseInStackQueuedSpinLockFromDpcLevel( &lh->lockh );
127 /* we are working from DPC level, so we can use usual spinlocks */
128 #define spin_lock_irq spin_lock
129 #define spin_unlock_irq spin_unlock
131 /* no diff in Windows */
132 #define spin_lock_irqsave spin_lock_irq
133 #define spin_unlock_irqrestore spin_unlock_irq
135 /* Windows doesn't support such kind of spinlocks so far, but may be tomorrow ... */
136 #define rwlock_init spin_lock_init
137 #define read_lock_irqsave spin_lock_irqsave
138 #define read_unlock_irqrestore spin_unlock_irqrestore
139 #define write_lock_irq spin_lock_irq
140 #define write_unlock_irq spin_unlock_irq