ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

spinlock.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.