Fix kernel-mode executive atom implementation (mostly add SEH and tidy up the code...
[reactos.git] / reactos / ntoskrnl / ex / list.c
index 2088ef9..fd2e678 100644 (file)
@@ -1,34 +1,45 @@
-/* $Id: list.c,v 1.11 2003/08/14 18:30:28 silverblade Exp $
+/* $Id$
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/ex/list.c
  * PURPOSE:         Manages double linked lists, single linked lists and
  *                  sequenced lists
+ *
  * PROGRAMMERS:     David Welch (welch@mcmail.com)
  *                  Casper S. Hornstrup (chorns@users.sourceforge.net)
- * UPDATE HISTORY:
- *   02-07-2001 CSH Implemented sequenced lists
  */
 
 /* INCLUDES *****************************************************************/
 
-//#ifdef __USE_W32API
-//#define NONAMELESSUNION
-//#endif
-#include <ddk/ntddk.h>
-
+#include <ntoskrnl.h>
 #define NDEBUG
 #include <internal/debug.h>
 
-static KSPIN_LOCK ExpGlobalListLock = { 0, };
-
 /* FUNCTIONS *************************************************************/
 
 /*
  * @implemented
  */
-PLIST_ENTRY FASTCALL
+PSLIST_ENTRY
+FASTCALL
+ExInterlockedFlushSList (
+    IN PSLIST_HEADER ListHead
+    )
+{
+    PSLIST_ENTRY Old;
+
+    Old = &ListHead->Next;
+    ListHead->Next.Next = 0;
+
+    return Old;
+}
+
+/*
+ * @implemented
+ */
+PLIST_ENTRY
+STDCALL
 ExInterlockedInsertHeadList(PLIST_ENTRY ListHead,
                            PLIST_ENTRY ListEntry,
                            PKSPIN_LOCK Lock)
@@ -63,7 +74,8 @@ ExInterlockedInsertHeadList(PLIST_ENTRY ListHead,
 /*
  * @implemented
  */
-PLIST_ENTRY FASTCALL
+PLIST_ENTRY
+STDCALL
 ExInterlockedInsertTailList(PLIST_ENTRY ListHead,
                            PLIST_ENTRY ListEntry,
                            PKSPIN_LOCK Lock)
@@ -98,7 +110,8 @@ ExInterlockedInsertTailList(PLIST_ENTRY ListHead,
 /*
  * @implemented
  */
-PLIST_ENTRY FASTCALL
+PLIST_ENTRY
+STDCALL
 ExInterlockedRemoveHeadList(PLIST_ENTRY Head,
                            PKSPIN_LOCK Lock)
 /*
@@ -127,6 +140,7 @@ ExInterlockedRemoveHeadList(PLIST_ENTRY Head,
 
 
 PLIST_ENTRY
+STDCALL
 ExInterlockedRemoveTailList(PLIST_ENTRY Head,
                            PKSPIN_LOCK Lock)
 /*
@@ -154,14 +168,13 @@ ExInterlockedRemoveTailList(PLIST_ENTRY Head,
 }
 
 
-#ifdef ExInterlockedPopEntrySList
 #undef ExInterlockedPopEntrySList
-#endif
 
 /*
  * @implemented
  */
-PSINGLE_LIST_ENTRY FASTCALL
+PSINGLE_LIST_ENTRY
+FASTCALL
 ExInterlockedPopEntrySList(IN PSLIST_HEADER ListHead,
                           IN PKSPIN_LOCK Lock)
 /*
@@ -187,14 +200,13 @@ ExInterlockedPopEntrySList(IN PSLIST_HEADER ListHead,
 }
 
 
-#ifdef ExInterlockedPushEntrySList
 #undef ExInterlockedPushEntrySList
-#endif
 
 /*
  * @implemented
  */
-PSINGLE_LIST_ENTRY FASTCALL
+PSINGLE_LIST_ENTRY
+FASTCALL
 ExInterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
                            IN PSINGLE_LIST_ENTRY ListEntry,
                            IN PKSPIN_LOCK Lock)
@@ -223,7 +235,8 @@ ExInterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
 /*
  * @implemented
  */
-PSINGLE_LIST_ENTRY FASTCALL
+PSINGLE_LIST_ENTRY
+STDCALL
 ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
                          IN PKSPIN_LOCK Lock)
 /*
@@ -247,7 +260,8 @@ ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
 /*
  * @implemented
  */
-PSINGLE_LIST_ENTRY FASTCALL
+PSINGLE_LIST_ENTRY
+STDCALL
 ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
                           IN PSINGLE_LIST_ENTRY ListEntry,
                           IN PKSPIN_LOCK Lock)
@@ -430,8 +444,26 @@ PSLIST_ENTRY
 FASTCALL
 InterlockedPopEntrySList(IN PSLIST_HEADER ListHead)
 {
-  return (PSLIST_ENTRY) ExInterlockedPopEntrySList(ListHead,
-    &ExpGlobalListLock);
+  SLIST_HEADER newslh, oldslh;
+  PSLIST_ENTRY le;
+
+  do
+  {
+    oldslh = *(volatile SLIST_HEADER *)ListHead;
+    le = oldslh.Next.Next;
+    if(le == NULL)
+    {
+      /* nothing to do */
+      return NULL;
+    }
+    newslh.Sequence = oldslh.Sequence + 1;
+    newslh.Depth = oldslh.Depth - 1;
+    newslh.Next.Next = MmSafeReadPtr(&le->Next);
+  } while(ExfInterlockedCompareExchange64((PLONGLONG)&ListHead->Alignment,
+                                          (PLONGLONG)&newslh.Alignment,
+                                          (PLONGLONG)&oldslh.Alignment) != (LONGLONG)oldslh.Alignment);
+
+  return le;
 }
 
 
@@ -441,11 +473,23 @@ InterlockedPopEntrySList(IN PSLIST_HEADER ListHead)
 PSLIST_ENTRY
 FASTCALL
 InterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
-  IN PSLIST_ENTRY ListEntry)
+                          IN PSLIST_ENTRY ListEntry)
 {
-  return (PSLIST_ENTRY) ExInterlockedPushEntrySList(ListHead,
-    ListEntry,
-    &ExpGlobalListLock);
+  SLIST_HEADER newslh, oldslh;
+
+  newslh.Next.Next = ListEntry;
+
+  do
+  {
+    oldslh = *(volatile SLIST_HEADER *)ListHead;
+    newslh.Depth = oldslh.Depth + 1;
+    newslh.Sequence = oldslh.Sequence + 1;
+    ListEntry->Next = oldslh.Next.Next;
+  } while(ExfInterlockedCompareExchange64((PLONGLONG)&ListHead->Alignment,
+                                          (PLONGLONG)&newslh.Alignment,
+                                          (PLONGLONG)&oldslh.Alignment) != (LONGLONG)oldslh.Alignment);
+
+  return oldslh.Next.Next;
 }
 
 /* EOF */