Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenspinlock.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS HAL 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: hal/halx86/up/spinlock.c 00005 * PURPOSE: Spinlock and Queued Spinlock Support 00006 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) 00007 */ 00008 00009 /* INCLUDES ******************************************************************/ 00010 00011 #include <ntoskrnl.h> 00012 #define NDEBUG 00013 #include <debug.h> 00014 00015 #undef KeAcquireSpinLock 00016 #undef KeReleaseSpinLock 00017 00018 /* FUNCTIONS *****************************************************************/ 00019 00020 /* 00021 * @implemented 00022 */ 00023 KIRQL 00024 KeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock) 00025 { 00026 KIRQL OldIrql; 00027 00028 /* Raise to sync */ 00029 KeRaiseIrql(SYNCH_LEVEL, &OldIrql); 00030 00031 /* Acquire the lock and return */ 00032 KxAcquireSpinLock(SpinLock); 00033 return OldIrql; 00034 } 00035 00036 /* 00037 * @implemented 00038 */ 00039 KIRQL 00040 NTAPI 00041 KeAcquireSpinLockRaiseToDpc(PKSPIN_LOCK SpinLock) 00042 { 00043 KIRQL OldIrql; 00044 00045 /* Raise to dispatch */ 00046 KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); 00047 00048 /* Acquire the lock and return */ 00049 KxAcquireSpinLock(SpinLock); 00050 return OldIrql; 00051 } 00052 00053 /* 00054 * @implemented 00055 */ 00056 VOID 00057 NTAPI 00058 KeReleaseSpinLock(PKSPIN_LOCK SpinLock, 00059 KIRQL OldIrql) 00060 { 00061 /* Release the lock and lower IRQL back */ 00062 KxReleaseSpinLock(SpinLock); 00063 KeLowerIrql(OldIrql); 00064 } 00065 00066 /* 00067 * @implemented 00068 */ 00069 KIRQL 00070 KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) 00071 { 00072 KIRQL OldIrql; 00073 00074 /* Raise to dispatch */ 00075 KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); 00076 00077 /* Acquire the lock */ 00078 KxAcquireSpinLock(KeGetCurrentPrcb()->LockQueue[LockNumber].Lock); // HACK 00079 return OldIrql; 00080 } 00081 00082 /* 00083 * @implemented 00084 */ 00085 KIRQL 00086 KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) 00087 { 00088 KIRQL OldIrql; 00089 00090 /* Raise to synch */ 00091 KeRaiseIrql(SYNCH_LEVEL, &OldIrql); 00092 00093 /* Acquire the lock */ 00094 KxAcquireSpinLock(KeGetCurrentPrcb()->LockQueue[LockNumber].Lock); // HACK 00095 return OldIrql; 00096 } 00097 00098 /* 00099 * @implemented 00100 */ 00101 VOID 00102 KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, 00103 IN PKLOCK_QUEUE_HANDLE LockHandle) 00104 { 00105 /* Set up the lock */ 00106 LockHandle->LockQueue.Next = NULL; 00107 LockHandle->LockQueue.Lock = SpinLock; 00108 00109 /* Raise to dispatch */ 00110 KeRaiseIrql(DISPATCH_LEVEL, &LockHandle->OldIrql); 00111 00112 /* Acquire the lock */ 00113 KxAcquireSpinLock(LockHandle->LockQueue.Lock); // HACK 00114 } 00115 00116 00117 /* 00118 * @implemented 00119 */ 00120 VOID 00121 KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock, 00122 IN PKLOCK_QUEUE_HANDLE LockHandle) 00123 { 00124 /* Set up the lock */ 00125 LockHandle->LockQueue.Next = NULL; 00126 LockHandle->LockQueue.Lock = SpinLock; 00127 00128 /* Raise to synch */ 00129 KeRaiseIrql(SYNCH_LEVEL, &LockHandle->OldIrql); 00130 00131 /* Acquire the lock */ 00132 KxAcquireSpinLock(LockHandle->LockQueue.Lock); // HACK 00133 } 00134 00135 00136 /* 00137 * @implemented 00138 */ 00139 VOID 00140 KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, 00141 IN KIRQL OldIrql) 00142 { 00143 /* Release the lock */ 00144 KxReleaseSpinLock(KeGetCurrentPrcb()->LockQueue[LockNumber].Lock); // HACK 00145 00146 /* Lower IRQL back */ 00147 KeLowerIrql(OldIrql); 00148 } 00149 00150 00151 /* 00152 * @implemented 00153 */ 00154 VOID 00155 KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle) 00156 { 00157 /* Simply lower IRQL back */ 00158 KxReleaseSpinLock(LockHandle->LockQueue.Lock); // HACK 00159 KeLowerIrql(LockHandle->OldIrql); 00160 } 00161 00162 00163 /* 00164 * @implemented 00165 */ 00166 BOOLEAN 00167 KeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, 00168 IN PKIRQL OldIrql) 00169 { 00170 #ifndef CONFIG_SMP 00171 /* Simply raise to dispatch */ 00172 KeRaiseIrql(DISPATCH_LEVEL, OldIrql); 00173 00174 /* Add an explicit memory barrier to prevent the compiler from reordering 00175 memory accesses across the borders of spinlocks */ 00176 KeMemoryBarrierWithoutFence(); 00177 00178 /* Always return true on UP Machines */ 00179 return TRUE; 00180 #else 00181 UNIMPLEMENTED; 00182 ASSERT(FALSE); 00183 #endif 00184 } 00185 00186 /* 00187 * @implemented 00188 */ 00189 LOGICAL 00190 KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, 00191 OUT PKIRQL OldIrql) 00192 { 00193 #ifndef CONFIG_SMP 00194 /* Simply raise to dispatch */ 00195 KeRaiseIrql(DISPATCH_LEVEL, OldIrql); 00196 00197 /* Add an explicit memory barrier to prevent the compiler from reordering 00198 memory accesses across the borders of spinlocks */ 00199 KeMemoryBarrierWithoutFence(); 00200 00201 /* Always return true on UP Machines */ 00202 return TRUE; 00203 #else 00204 UNIMPLEMENTED; 00205 ASSERT(FALSE); 00206 #endif 00207 } 00208 00209 /* EOF */ Generated on Sat May 26 2012 04:27:16 for ReactOS by
1.7.6.1
|