Fix kernel-mode executive atom implementation (mostly add SEH and tidy up the code...
[reactos.git] / reactos / ntoskrnl / ex / list.c
index d5dee48..fd2e678 100644 (file)
@@ -1,27 +1,45 @@
-/* $Id: list.c,v 1.7 2002/09/08 10:23:19 chorns 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 *****************************************************************/
 
-#include <ddk/ntddk.h>
-
+#include <ntoskrnl.h>
 #define NDEBUG
 #include <internal/debug.h>
 
 /* FUNCTIONS *************************************************************/
 
+/*
+ * @implemented
+ */
+PSLIST_ENTRY
+FASTCALL
+ExInterlockedFlushSList (
+    IN PSLIST_HEADER ListHead
+    )
+{
+    PSLIST_ENTRY Old;
+
+    Old = &ListHead->Next;
+    ListHead->Next.Next = 0;
+
+    return Old;
+}
 
-PLIST_ENTRY STDCALL
+/*
+ * @implemented
+ */
+PLIST_ENTRY
+STDCALL
 ExInterlockedInsertHeadList(PLIST_ENTRY ListHead,
                            PLIST_ENTRY ListEntry,
                            PKSPIN_LOCK Lock)
@@ -53,7 +71,11 @@ ExInterlockedInsertHeadList(PLIST_ENTRY ListHead,
 }
 
 
-PLIST_ENTRY STDCALL
+/*
+ * @implemented
+ */
+PLIST_ENTRY
+STDCALL
 ExInterlockedInsertTailList(PLIST_ENTRY ListHead,
                            PLIST_ENTRY ListEntry,
                            PKSPIN_LOCK Lock)
@@ -85,7 +107,11 @@ ExInterlockedInsertTailList(PLIST_ENTRY ListHead,
 }
 
 
-PLIST_ENTRY STDCALL
+/*
+ * @implemented
+ */
+PLIST_ENTRY
+STDCALL
 ExInterlockedRemoveHeadList(PLIST_ENTRY Head,
                            PKSPIN_LOCK Lock)
 /*
@@ -114,6 +140,7 @@ ExInterlockedRemoveHeadList(PLIST_ENTRY Head,
 
 
 PLIST_ENTRY
+STDCALL
 ExInterlockedRemoveTailList(PLIST_ENTRY Head,
                            PKSPIN_LOCK Lock)
 /*
@@ -141,7 +168,13 @@ ExInterlockedRemoveTailList(PLIST_ENTRY Head,
 }
 
 
-PSINGLE_LIST_ENTRY FASTCALL
+#undef ExInterlockedPopEntrySList
+
+/*
+ * @implemented
+ */
+PSINGLE_LIST_ENTRY
+FASTCALL
 ExInterlockedPopEntrySList(IN PSLIST_HEADER ListHead,
                           IN PKSPIN_LOCK Lock)
 /*
@@ -156,18 +189,24 @@ ExInterlockedPopEntrySList(IN PSLIST_HEADER ListHead,
   KIRQL oldlvl;
 
   KeAcquireSpinLock(Lock,&oldlvl);
-  ret = PopEntryList(&ListHead->s.Next);
+  ret = PopEntryList(&ListHead->Next);
   if (ret)
     {
-      ListHead->s.Depth--;
-      ListHead->s.Sequence++;
+      ListHead->Depth--;
+      ListHead->Sequence++;
     }
   KeReleaseSpinLock(Lock,oldlvl);
   return(ret);
 }
 
 
-PSINGLE_LIST_ENTRY FASTCALL
+#undef ExInterlockedPushEntrySList
+
+/*
+ * @implemented
+ */
+PSINGLE_LIST_ENTRY
+FASTCALL
 ExInterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
                            IN PSINGLE_LIST_ENTRY ListEntry,
                            IN PKSPIN_LOCK Lock)
@@ -184,16 +223,20 @@ ExInterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
   PSINGLE_LIST_ENTRY ret;
 
   KeAcquireSpinLock(Lock,&oldlvl);
-  ret=ListHead->s.Next.Next;
-  PushEntryList(&ListHead->s.Next,ListEntry);
-  ListHead->s.Depth++;
-  ListHead->s.Sequence++;
+  ret=ListHead->Next.Next;
+  PushEntryList(&ListHead->Next,ListEntry);
+  ListHead->Depth++;
+  ListHead->Sequence++;
   KeReleaseSpinLock(Lock,oldlvl);
   return(ret);
 }
 
 
-PSINGLE_LIST_ENTRY STDCALL
+/*
+ * @implemented
+ */
+PSINGLE_LIST_ENTRY
+STDCALL
 ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
                          IN PKSPIN_LOCK Lock)
 /*
@@ -214,7 +257,11 @@ ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
 }
 
 
-PSINGLE_LIST_ENTRY STDCALL
+/*
+ * @implemented
+ */
+PSINGLE_LIST_ENTRY
+STDCALL
 ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
                           IN PSINGLE_LIST_ENTRY ListEntry,
                           IN PKSPIN_LOCK Lock)
@@ -238,6 +285,9 @@ ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
 }
 
 
+/*
+ * @implemented
+ */
 PLIST_ENTRY FASTCALL
 ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead,
                             IN PLIST_ENTRY ListEntry,
@@ -270,6 +320,9 @@ ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead,
 }
 
 
+/*
+ * @implemented
+ */
 PLIST_ENTRY FASTCALL
 ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
                             IN PLIST_ENTRY ListEntry,
@@ -302,6 +355,9 @@ ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
 }
 
 
+/*
+ * @implemented
+ */
 PSINGLE_LIST_ENTRY FASTCALL
 ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
                           IN PKSPIN_LOCK Lock)
@@ -323,6 +379,9 @@ ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
 }
 
 
+/*
+ * @implemented
+ */
 PSINGLE_LIST_ENTRY FASTCALL
 ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
                            IN PSINGLE_LIST_ENTRY ListEntry,
@@ -347,6 +406,9 @@ ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
 }
 
 
+/*
+ * @implemented
+ */
 PLIST_ENTRY FASTCALL
 ExfInterlockedRemoveHeadList(IN PLIST_ENTRY Head,
                             IN PKSPIN_LOCK Lock)
@@ -374,4 +436,60 @@ ExfInterlockedRemoveHeadList(IN PLIST_ENTRY Head,
   return(ret);
 }
 
+
+/*
+ * @implemented
+ */
+PSLIST_ENTRY
+FASTCALL
+InterlockedPopEntrySList(IN PSLIST_HEADER ListHead)
+{
+  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;
+}
+
+
+/*
+ * @implemented
+ */
+PSLIST_ENTRY
+FASTCALL
+InterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
+                          IN PSLIST_ENTRY ListEntry)
+{
+  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 */