[ros-diffs] [tkreuzer] 52875: [NTOSKRNL] Fix bugs in ExInterlocked functions.

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Mon Jul 25 21:06:45 UTC 2011


Author: tkreuzer
Date: Mon Jul 25 21:06:44 2011
New Revision: 52875

URL: http://svn.reactos.org/svn/reactos?rev=52875&view=rev
Log:
[NTOSKRNL]
Fix bugs in ExInterlocked functions.

Modified:
    trunk/reactos/ntoskrnl/ex/i386/interlocked.c

Modified: trunk/reactos/ntoskrnl/ex/i386/interlocked.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/i386/interlocked.c?rev=52875&r1=52874&r2=52875&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ex/i386/interlocked.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ex/i386/interlocked.c [iso-8859-1] Mon Jul 25 21:06:44 2011
@@ -85,7 +85,7 @@
     /* Release the spinlock and restore interrupts */
     _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
 
-    /* return the old value */
+    /* Return the old value */
     return OldValue;
 }
 
@@ -111,7 +111,7 @@
     /* Release the spinlock and restore interrupts */
     _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
 
-    /* return the old value */
+    /* Return the old value */
     return OldValue;
 }
 
@@ -137,8 +137,8 @@
     /* Release the spinlock and restore interrupts */
     _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
 
-    /* return the first entry */
-    return FirstEntry;
+    /* Return the old first entry or NULL for empty list */
+    return (FirstEntry == ListHead) ? NULL : FirstEntry;
 }
 
 PLIST_ENTRY
@@ -163,202 +163,13 @@
     /* Release the spinlock and restore interrupts */
     _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
 
-    /* return the last entry */
-    return LastEntry;
+    /* Return the old last entry or NULL for empty list */
+    return (LastEntry == ListHead) ? NULL : LastEntry;
 }
 
 PLIST_ENTRY
 NTAPI
 ExInterlockedRemoveHeadList(
-    IN OUT PLIST_ENTRY ListHead,
-    IN OUT PKSPIN_LOCK Lock)
-{
-    ULONG_PTR LockHandle;
-    PLIST_ENTRY ListEntry;
-
-    /* Disable interrupts and acquire the spinlock */
-    LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
-
-    /* Remove the first entry from the list head */
-    ListEntry = RemoveHeadList(ListHead);
-
-    /* Release the spinlock and restore interrupts */
-    _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
-
-    /* return the entry */
-    return ListEntry;
-}
-
-PSINGLE_LIST_ENTRY
-NTAPI
-ExInterlockedPopEntryList(
-    IN OUT PSINGLE_LIST_ENTRY ListHead,
-    IN OUT PKSPIN_LOCK Lock)
-{
-    ULONG_PTR LockHandle;
-    PSINGLE_LIST_ENTRY ListEntry;
-
-    /* Disable interrupts and acquire the spinlock */
-    LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
-
-    /* Pop the first entry from the list */
-    ListEntry = PopEntryList(ListHead);
-
-    /* Release the spinlock and restore interrupts */
-    _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
-
-    /* return the entry */
-    return ListEntry;
-}
-
-PSINGLE_LIST_ENTRY
-NTAPI
-ExInterlockedPushEntryList(
-    IN OUT PSINGLE_LIST_ENTRY ListHead,
-    IN OUT PSINGLE_LIST_ENTRY ListEntry,
-    IN OUT PKSPIN_LOCK Lock)
-{
-    ULONG_PTR LockHandle;
-    PSINGLE_LIST_ENTRY OldListEntry;
-
-    /* Disable interrupts and acquire the spinlock */
-    LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
-
-    /* Save the old top entry */
-    OldListEntry = ListHead->Next;
-
-    /* Push a new entry on the list */
-    PushEntryList(ListHead, ListEntry);
-
-    /* Release the spinlock and restore interrupts */
-    _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
-
-    /* return the entry */
-    return OldListEntry;
-}
-
-INTERLOCKED_RESULT
-NTAPI
-ExInterlockedIncrementLong(
-  IN PLONG Addend,
-  IN PKSPIN_LOCK Lock)
-{
-    LONG Result;
-
-    Result = _InterlockedIncrement(Addend);
-    return (Result < 0) ? ResultNegative :
-           (Result > 0) ? ResultPositive :
-           ResultZero;
-}
-
-INTERLOCKED_RESULT
-NTAPI
-ExInterlockedDecrementLong(
-  IN PLONG Addend,
-  IN PKSPIN_LOCK Lock)
-{
-    LONG Result;
-
-    Result = _InterlockedDecrement(Addend);
-    return (Result < 0) ? ResultNegative :
-           (Result > 0) ? ResultPositive :
-           ResultZero;
-}
-
-ULONG
-NTAPI
-ExInterlockedExchangeUlong(
-  IN PULONG Target,
-  IN ULONG Value,
-  IN PKSPIN_LOCK Lock)
-{
-    return (ULONG)_InterlockedExchange((PLONG)Target, (LONG)Value);
-}
-
-#ifdef _M_IX86
-
-ULONG
-FASTCALL
-ExfInterlockedAddUlong(
-    IN OUT PULONG Addend,
-    IN ULONG Increment,
-    IN OUT PKSPIN_LOCK Lock)
-{
-    ULONG_PTR LockHandle;
-    ULONG OldValue;
-
-    /* Disable interrupts and acquire the spinlock */
-    LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
-
-    /* Save the old value */
-    OldValue = *Addend;
-
-    /* Do the operation */
-    *Addend += Increment;
-
-    /* Release the spinlock and restore interrupts */
-    _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
-
-    /* return the old value */
-    return OldValue;
-}
-
-PLIST_ENTRY
-FASTCALL
-ExfInterlockedInsertHeadList(
-    IN OUT PLIST_ENTRY ListHead,
-    IN PLIST_ENTRY ListEntry,
-    IN OUT PKSPIN_LOCK Lock)
-{
-    ULONG_PTR LockHandle;
-    PLIST_ENTRY FirstEntry;
-
-    /* Disable interrupts and acquire the spinlock */
-    LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
-
-    /* Save the first entry */
-    FirstEntry = ListHead->Flink;
-
-    /* Insert the new entry */
-    InsertHeadList(ListHead, ListEntry);
-
-    /* Release the spinlock and restore interrupts */
-    _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
-
-    /* return the first entry */
-    return FirstEntry;
-}
-
-PLIST_ENTRY
-FASTCALL
-ExfInterlockedInsertTailList(
-    IN OUT PLIST_ENTRY ListHead,
-    IN PLIST_ENTRY ListEntry,
-    IN OUT PKSPIN_LOCK Lock)
-{
-    ULONG_PTR LockHandle;
-    PLIST_ENTRY LastEntry;
-
-    /* Disable interrupts and acquire the spinlock */
-    LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
-
-    /* Save the last entry */
-    LastEntry = ListHead->Blink;
-
-    /* Insert the new entry */
-    InsertTailList(ListHead, ListEntry);
-
-    /* Release the spinlock and restore interrupts */
-    _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
-
-    /* return the last entry */
-    return LastEntry;
-}
-
-
-PLIST_ENTRY
-FASTCALL
-ExfInterlockedRemoveHeadList(
     IN OUT PLIST_ENTRY ListHead,
     IN OUT PKSPIN_LOCK Lock)
 {
@@ -383,6 +194,204 @@
     /* Release the spinlock and restore interrupts */
     _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
 
+    /* Return the entry */
+    return ListEntry;
+}
+
+PSINGLE_LIST_ENTRY
+NTAPI
+ExInterlockedPopEntryList(
+    IN OUT PSINGLE_LIST_ENTRY ListHead,
+    IN OUT PKSPIN_LOCK Lock)
+{
+    ULONG_PTR LockHandle;
+    PSINGLE_LIST_ENTRY ListEntry;
+
+    /* Disable interrupts and acquire the spinlock */
+    LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
+
+    /* Pop the first entry from the list */
+    ListEntry = PopEntryList(ListHead);
+
+    /* Release the spinlock and restore interrupts */
+    _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
+
+    /* Return the entry */
+    return ListEntry;
+}
+
+PSINGLE_LIST_ENTRY
+NTAPI
+ExInterlockedPushEntryList(
+    IN OUT PSINGLE_LIST_ENTRY ListHead,
+    IN OUT PSINGLE_LIST_ENTRY ListEntry,
+    IN OUT PKSPIN_LOCK Lock)
+{
+    ULONG_PTR LockHandle;
+    PSINGLE_LIST_ENTRY OldListEntry;
+
+    /* Disable interrupts and acquire the spinlock */
+    LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
+
+    /* Save the old top entry */
+    OldListEntry = ListHead->Next;
+
+    /* Push a new entry on the list */
+    PushEntryList(ListHead, ListEntry);
+
+    /* Release the spinlock and restore interrupts */
+    _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
+
+    /* Return the entry */
+    return OldListEntry;
+}
+
+INTERLOCKED_RESULT
+NTAPI
+ExInterlockedIncrementLong(
+  IN PLONG Addend,
+  IN PKSPIN_LOCK Lock)
+{
+    LONG Result;
+
+    Result = _InterlockedIncrement(Addend);
+    return (Result < 0) ? ResultNegative :
+           (Result > 0) ? ResultPositive :
+           ResultZero;
+}
+
+INTERLOCKED_RESULT
+NTAPI
+ExInterlockedDecrementLong(
+  IN PLONG Addend,
+  IN PKSPIN_LOCK Lock)
+{
+    LONG Result;
+
+    Result = _InterlockedDecrement(Addend);
+    return (Result < 0) ? ResultNegative :
+           (Result > 0) ? ResultPositive :
+           ResultZero;
+}
+
+ULONG
+NTAPI
+ExInterlockedExchangeUlong(
+  IN PULONG Target,
+  IN ULONG Value,
+  IN PKSPIN_LOCK Lock)
+{
+    return (ULONG)_InterlockedExchange((PLONG)Target, (LONG)Value);
+}
+
+#ifdef _M_IX86
+
+ULONG
+FASTCALL
+ExfInterlockedAddUlong(
+    IN OUT PULONG Addend,
+    IN ULONG Increment,
+    IN OUT PKSPIN_LOCK Lock)
+{
+    ULONG_PTR LockHandle;
+    ULONG OldValue;
+
+    /* Disable interrupts and acquire the spinlock */
+    LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
+
+    /* Save the old value */
+    OldValue = *Addend;
+
+    /* Do the operation */
+    *Addend += Increment;
+
+    /* Release the spinlock and restore interrupts */
+    _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
+
+    /* Return the old value */
+    return OldValue;
+}
+
+PLIST_ENTRY
+FASTCALL
+ExfInterlockedInsertHeadList(
+    IN OUT PLIST_ENTRY ListHead,
+    IN PLIST_ENTRY ListEntry,
+    IN OUT PKSPIN_LOCK Lock)
+{
+    ULONG_PTR LockHandle;
+    PLIST_ENTRY FirstEntry;
+
+    /* Disable interrupts and acquire the spinlock */
+    LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
+
+    /* Save the first entry */
+    FirstEntry = ListHead->Flink;
+
+    /* Insert the new entry */
+    InsertHeadList(ListHead, ListEntry);
+
+    /* Release the spinlock and restore interrupts */
+    _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
+
+    /* Return the old first entry or NULL for empty list */
+    return (FirstEntry == ListHead) ? NULL : FirstEntry;
+}
+
+PLIST_ENTRY
+FASTCALL
+ExfInterlockedInsertTailList(
+    IN OUT PLIST_ENTRY ListHead,
+    IN PLIST_ENTRY ListEntry,
+    IN OUT PKSPIN_LOCK Lock)
+{
+    ULONG_PTR LockHandle;
+    PLIST_ENTRY LastEntry;
+
+    /* Disable interrupts and acquire the spinlock */
+    LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
+
+    /* Save the last entry */
+    LastEntry = ListHead->Blink;
+
+    /* Insert the new entry */
+    InsertTailList(ListHead, ListEntry);
+
+    /* Release the spinlock and restore interrupts */
+    _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
+
+    /* Return the old last entry or NULL for empty list */
+    return (LastEntry == ListHead) ? NULL : LastEntry;
+}
+
+
+PLIST_ENTRY
+FASTCALL
+ExfInterlockedRemoveHeadList(
+    IN OUT PLIST_ENTRY ListHead,
+    IN OUT PKSPIN_LOCK Lock)
+{
+    ULONG_PTR LockHandle;
+    PLIST_ENTRY ListEntry;
+
+    /* Disable interrupts and acquire the spinlock */
+    LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
+
+    /* Check if the list is empty */
+    if (IsListEmpty(ListHead))
+    {
+        /* Return NULL */
+        ListEntry = NULL;
+    }
+    else
+    {
+        /* Remove the first entry from the list head */
+        ListEntry = RemoveHeadList(ListHead);
+    }
+
+    /* Release the spinlock and restore interrupts */
+    _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
+
     /* return the entry */
     return ListEntry;
 }




More information about the Ros-diffs mailing list