ReactOS Fundraising Campaign 2012
 
€ 4,060 / € 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 /* This file is compiled twice. Once for UP and once for MP */
00012 
00013 #include <hal.h>
00014 #define NDEBUG
00015 #include <debug.h>
00016 
00017 #include <internal/spinlock.h>
00018 
00019 #undef KeAcquireSpinLock
00020 #undef KeReleaseSpinLock
00021 
00022 /* GLOBALS *******************************************************************/
00023 
00024 ULONG_PTR HalpSystemHardwareFlags;
00025 KSPIN_LOCK HalpSystemHardwareLock;
00026 
00027 /* FUNCTIONS *****************************************************************/
00028 
00029 #ifdef _M_IX86
00030 
00031 /*
00032  * @implemented
00033  */
00034 KIRQL
00035 FASTCALL
00036 KeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock)
00037 {
00038     KIRQL OldIrql;
00039 
00040     /* Raise to sync */
00041     KeRaiseIrql(SYNCH_LEVEL, &OldIrql);
00042 
00043     /* Acquire the lock and return */
00044     KxAcquireSpinLock(SpinLock);
00045     return OldIrql;
00046 }
00047 
00048 /*
00049  * @implemented
00050  */
00051 KIRQL
00052 FASTCALL
00053 KfAcquireSpinLock(PKSPIN_LOCK SpinLock)
00054 {
00055     KIRQL OldIrql;
00056 
00057     /* Raise to dispatch and acquire the lock */
00058     KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
00059     KxAcquireSpinLock(SpinLock);
00060     return OldIrql;
00061 }
00062 
00063 /*
00064  * @implemented
00065  */
00066 VOID
00067 FASTCALL
00068 KfReleaseSpinLock(PKSPIN_LOCK SpinLock,
00069                   KIRQL OldIrql)
00070 {
00071     /* Release the lock and lower IRQL back */
00072     KxReleaseSpinLock(SpinLock);
00073     KeLowerIrql(OldIrql);
00074 }
00075 
00076 /*
00077  * @implemented
00078  */
00079 KIRQL
00080 FASTCALL
00081 KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
00082 {
00083     KIRQL OldIrql;
00084 
00085     /* Raise to dispatch */
00086     KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
00087 
00088     /* Acquire the lock */
00089     KxAcquireSpinLock(KeGetCurrentPrcb()->LockQueue[LockNumber].Lock); // HACK
00090     return OldIrql;
00091 }
00092 
00093 /*
00094  * @implemented
00095  */
00096 KIRQL
00097 FASTCALL
00098 KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
00099 {
00100     KIRQL OldIrql;
00101 
00102     /* Raise to synch */
00103     KeRaiseIrql(SYNCH_LEVEL, &OldIrql);
00104 
00105     /* Acquire the lock */
00106     KxAcquireSpinLock(KeGetCurrentPrcb()->LockQueue[LockNumber].Lock); // HACK
00107     return OldIrql;
00108 }
00109 
00110 /*
00111  * @implemented
00112  */
00113 VOID
00114 FASTCALL
00115 KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock,
00116                                IN PKLOCK_QUEUE_HANDLE LockHandle)
00117 {
00118     /* Set up the lock */
00119     LockHandle->LockQueue.Next = NULL;
00120     LockHandle->LockQueue.Lock = SpinLock;
00121 
00122     /* Raise to dispatch */
00123     KeRaiseIrql(DISPATCH_LEVEL, &LockHandle->OldIrql);
00124 
00125     /* Acquire the lock */
00126     KxAcquireSpinLock(LockHandle->LockQueue.Lock); // HACK
00127 }
00128 
00129 /*
00130  * @implemented
00131  */
00132 VOID
00133 FASTCALL
00134 KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock,
00135                                            IN PKLOCK_QUEUE_HANDLE LockHandle)
00136 {
00137     /* Set up the lock */
00138     LockHandle->LockQueue.Next = NULL;
00139     LockHandle->LockQueue.Lock = SpinLock;
00140 
00141     /* Raise to synch */
00142     KeRaiseIrql(SYNCH_LEVEL, &LockHandle->OldIrql);
00143 
00144     /* Acquire the lock */
00145     KxAcquireSpinLock(LockHandle->LockQueue.Lock); // HACK
00146 }
00147 
00148 /*
00149  * @implemented
00150  */
00151 VOID
00152 FASTCALL
00153 KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber,
00154                         IN KIRQL OldIrql)
00155 {
00156     /* Release the lock */
00157     KxReleaseSpinLock(KeGetCurrentPrcb()->LockQueue[LockNumber].Lock); // HACK
00158 
00159     /* Lower IRQL back */
00160     KeLowerIrql(OldIrql);
00161 }
00162 
00163 /*
00164  * @implemented
00165  */
00166 VOID
00167 FASTCALL
00168 KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle)
00169 {
00170     /* Simply lower IRQL back */
00171     KxReleaseSpinLock(LockHandle->LockQueue.Lock); // HACK
00172     KeLowerIrql(LockHandle->OldIrql);
00173 }
00174 
00175 /*
00176  * @implemented
00177  */
00178 BOOLEAN
00179 FASTCALL
00180 KeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber,
00181                                          IN PKIRQL OldIrql)
00182 {
00183 #ifdef CONFIG_SMP
00184     ASSERT(FALSE); // FIXME: Unused
00185     while (TRUE);
00186 #endif
00187 
00188     /* Simply raise to synch */
00189     KeRaiseIrql(SYNCH_LEVEL, OldIrql);
00190 
00191     /* Add an explicit memory barrier to prevent the compiler from reordering
00192        memory accesses across the borders of spinlocks */
00193     KeMemoryBarrierWithoutFence();
00194 
00195     /* Always return true on UP Machines */
00196     return TRUE;
00197 }
00198 
00199 /*
00200  * @implemented
00201  */
00202 LOGICAL
00203 FASTCALL
00204 KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber,
00205                              OUT PKIRQL OldIrql)
00206 {
00207 #ifdef CONFIG_SMP
00208     ASSERT(FALSE); // FIXME: Unused
00209     while (TRUE);
00210 #endif
00211 
00212     /* Simply raise to dispatch */
00213     KeRaiseIrql(DISPATCH_LEVEL, OldIrql);
00214 
00215     /* Add an explicit memory barrier to prevent the compiler from reordering
00216        memory accesses across the borders of spinlocks */
00217     KeMemoryBarrierWithoutFence();
00218 
00219     /* Always return true on UP Machines */
00220     return TRUE;
00221 }
00222 
00223 #endif
00224 
00225 VOID
00226 NTAPI
00227 HalpAcquireCmosSpinLock(VOID)
00228 {
00229     ULONG_PTR Flags;
00230 
00231     /* Get flags and disable interrupts */
00232     Flags = __readeflags();
00233     _disable();
00234 
00235     /* Acquire the lock */
00236     KxAcquireSpinLock(&HalpSystemHardwareLock);
00237 
00238     /* We have the lock, save the flags now */
00239     HalpSystemHardwareFlags = Flags;
00240 }
00241 
00242 VOID
00243 NTAPI
00244 HalpReleaseCmosSpinLock(VOID)
00245 {
00246     ULONG_PTR Flags;
00247 
00248     /* Get the flags */
00249     Flags = HalpSystemHardwareFlags;
00250 
00251     /* Release the lock */
00252     KxReleaseSpinLock(&HalpSystemHardwareLock);
00253 
00254     /* Restore the flags */
00255     __writeeflags(Flags);
00256 }
00257 

Generated on Tue May 22 2012 04:32:41 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.