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

interlocked.c
Go to the documentation of this file.
00001 typedef unsigned int size_t;
00002 #include <ntddk.h>
00003 #include <winddk.h>
00004 #include <string.h>
00005 #include <intrin.h>
00006 
00007 NTKERNELAPI
00008 LONG
00009 FASTCALL
00010 InterlockedExchange(
00011     LONG volatile *Target, LONG Value)
00012 {
00013     return _InterlockedExchange(Target, Value);
00014 }
00015 
00016 NTKERNELAPI
00017 LONG
00018 FASTCALL
00019 InterlockedExchangeAdd(
00020     LONG volatile *Target, LONG Value)
00021 {
00022     return _InterlockedExchangeAdd(Target, Value);
00023 }
00024 
00025 NTKERNELAPI
00026 LONG
00027 WINAPI
00028 InterlockedCompareExchange(
00029     LONG volatile *Destination,
00030     LONG Exchange, LONG Comparand)
00031 {
00032     return _InterlockedCompareExchange(Destination, Exchange, Comparand);
00033 }
00034 
00035 NTKERNELAPI
00036 LONG
00037 FASTCALL
00038 InterlockedIncrement
00039 (IN OUT LONG volatile *Addend)
00040 {
00041     return _InterlockedIncrement(Addend);
00042 }
00043 
00044 NTKERNELAPI
00045 LONG
00046 FASTCALL
00047 InterlockedDecrement(
00048     IN OUT LONG volatile *Addend)
00049 {
00050     return _InterlockedDecrement(Addend);
00051 }
00052 
00053 PSLIST_ENTRY
00054 WINAPI 
00055 InterlockedPopEntrySList(
00056     PSLIST_HEADER ListHead)
00057 {
00058     PSLIST_ENTRY Result = NULL;
00059     KIRQL OldIrql;
00060     static BOOLEAN GLLInit = FALSE;
00061     static KSPIN_LOCK GlobalListLock;
00062 
00063     if(!GLLInit)
00064     {
00065         KeInitializeSpinLock(&GlobalListLock);
00066         GLLInit = TRUE;
00067     }
00068 
00069     KeAcquireSpinLock(&GlobalListLock, &OldIrql);
00070     if(ListHead->Next.Next)
00071     {
00072         Result = ListHead->Next.Next;
00073         ListHead->Next.Next = Result->Next;
00074     }
00075     KeReleaseSpinLock(&GlobalListLock, OldIrql);
00076     return Result;
00077 }
00078 
00079 NTKERNELAPI
00080 PSLIST_ENTRY
00081 FASTCALL
00082 InterlockedPushEntrySList(
00083     IN PSLIST_HEADER ListHead,
00084     IN PSLIST_ENTRY ListEntry)
00085 {
00086     PVOID PrevValue;
00087 
00088     do
00089     {
00090         PrevValue = ListHead->Next.Next;
00091         ListEntry->Next = PrevValue;
00092     }
00093     while (InterlockedCompareExchangePointer(&ListHead->Next.Next,
00094                                              ListEntry,
00095                                              PrevValue) != PrevValue);
00096 
00097     return (PSLIST_ENTRY)PrevValue;
00098 }
00099 
00100 NTKERNELAPI
00101 VOID
00102 FASTCALL
00103 ExInterlockedAddLargeStatistic(
00104     IN PLARGE_INTEGER Addend,
00105     IN ULONG Increment)
00106 {
00107     _InterlockedAddLargeStatistic(&Addend->QuadPart, Increment);
00108 }
00109 
00110 NTKERNELAPI
00111 LONGLONG
00112 FASTCALL
00113 ExInterlockedCompareExchange64(
00114     IN OUT PLONGLONG  Destination,
00115     IN PLONGLONG  Exchange,
00116     IN PLONGLONG  Comparand,
00117     IN PKSPIN_LOCK  Lock)
00118 {
00119     KIRQL OldIrql;
00120     LONGLONG Result;
00121 
00122     KeAcquireSpinLock(Lock, &OldIrql);
00123     Result = *Destination;
00124     if(*Destination == Result)
00125         *Destination = *Exchange;
00126     KeReleaseSpinLock(Lock, OldIrql);
00127     return Result;
00128 }

Generated on Sun May 27 2012 04:36:22 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.