Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygeninterlocked.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
1.7.6.1
|