Fix kernel-mode executive atom implementation (mostly add SEH and tidy up the code...
[reactos.git] / reactos / ntoskrnl / ex / list.c
index 1cd816c..fd2e678 100644 (file)
@@ -1,28 +1,45 @@
-/* $Id: list.c,v 1.6 2002/09/07 15:12:50 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 <ntoskrnl.h>
-
 #define NDEBUG
 #include <internal/debug.h>
 
-static KSPIN_LOCK ExpGlobalInterlockedLock = 0;
-
 /* FUNCTIONS *************************************************************/
 
-PLIST_ENTRY FASTCALL
+/*
+ * @implemented
+ */
+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)
@@ -54,7 +71,11 @@ ExInterlockedInsertHeadList(PLIST_ENTRY ListHead,
 }
 
 
-PLIST_ENTRY FASTCALL
+/*
+ * @implemented
+ */
+PLIST_ENTRY
+STDCALL
 ExInterlockedInsertTailList(PLIST_ENTRY ListHead,
                            PLIST_ENTRY ListEntry,
                            PKSPIN_LOCK Lock)
@@ -86,7 +107,11 @@ ExInterlockedInsertTailList(PLIST_ENTRY ListHead,
 }
 
 
-PLIST_ENTRY FASTCALL
+/*
+ * @implemented
+ */
+PLIST_ENTRY
+STDCALL
 ExInterlockedRemoveHeadList(PLIST_ENTRY Head,
                            PKSPIN_LOCK Lock)
 /*
@@ -113,7 +138,9 @@ ExInterlockedRemoveHeadList(PLIST_ENTRY Head,
   return(ret);
 }
 
-PLIST_ENTRY FASTCALL
+
+PLIST_ENTRY
+STDCALL
 ExInterlockedRemoveTailList(PLIST_ENTRY Head,
                            PKSPIN_LOCK Lock)
 /*
@@ -140,9 +167,14 @@ ExInterlockedRemoveTailList(PLIST_ENTRY Head,
   return(ret);
 }
 
+
 #undef ExInterlockedPopEntrySList
 
-PSINGLE_LIST_ENTRY FASTCALL
+/*
+ * @implemented
+ */
+PSINGLE_LIST_ENTRY
+FASTCALL
 ExInterlockedPopEntrySList(IN PSLIST_HEADER ListHead,
                           IN PKSPIN_LOCK Lock)
 /*
@@ -167,9 +199,14 @@ ExInterlockedPopEntrySList(IN PSLIST_HEADER ListHead,
   return(ret);
 }
 
+
 #undef ExInterlockedPushEntrySList
 
-PSINGLE_LIST_ENTRY FASTCALL
+/*
+ * @implemented
+ */
+PSINGLE_LIST_ENTRY
+FASTCALL
 ExInterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
                            IN PSINGLE_LIST_ENTRY ListEntry,
                            IN PKSPIN_LOCK Lock)
@@ -195,7 +232,11 @@ ExInterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
 }
 
 
-PSINGLE_LIST_ENTRY FASTCALL
+/*
+ * @implemented
+ */
+PSINGLE_LIST_ENTRY
+STDCALL
 ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
                          IN PKSPIN_LOCK Lock)
 /*
@@ -216,7 +257,11 @@ ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
 }
 
 
-PSINGLE_LIST_ENTRY FASTCALL
+/*
+ * @implemented
+ */
+PSINGLE_LIST_ENTRY
+STDCALL
 ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
                           IN PSINGLE_LIST_ENTRY ListEntry,
                           IN PKSPIN_LOCK Lock)
@@ -240,6 +285,9 @@ ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
 }
 
 
+/*
+ * @implemented
+ */
 PLIST_ENTRY FASTCALL
 ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead,
                             IN PLIST_ENTRY ListEntry,
@@ -272,6 +320,9 @@ ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead,
 }
 
 
+/*
+ * @implemented
+ */
 PLIST_ENTRY FASTCALL
 ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
                             IN PLIST_ENTRY ListEntry,
@@ -304,6 +355,9 @@ ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
 }
 
 
+/*
+ * @implemented
+ */
 PSINGLE_LIST_ENTRY FASTCALL
 ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
                           IN PKSPIN_LOCK Lock)
@@ -325,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,
@@ -349,6 +406,9 @@ ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
 }
 
 
+/*
+ * @implemented
+ */
 PLIST_ENTRY FASTCALL
 ExfInterlockedRemoveHeadList(IN PLIST_ENTRY Head,
                             IN PKSPIN_LOCK Lock)
@@ -377,42 +437,59 @@ ExfInterlockedRemoveHeadList(IN PLIST_ENTRY Head,
 }
 
 
+/*
+ * @implemented
+ */
 PSLIST_ENTRY
 FASTCALL
-InterlockedPopEntrySList(
-  IN PSLIST_HEADER  ListHead)
+InterlockedPopEntrySList(IN PSLIST_HEADER ListHead)
 {
-       KIRQL OldIrql;
-       PSLIST_ENTRY Value;
-
-       KeAcquireSpinLock(&ExpGlobalInterlockedLock, &OldIrql);
-       Value = PopEntryList(&ListHead->Next);
-       if (Value)
-               {
-                       ListHead->Depth--;
-                       ListHead->Sequence++;
-         }
-       KeReleaseSpinLock(&ExpGlobalInterlockedLock, OldIrql);
-       return(Value);
+  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)
+InterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
+                          IN PSLIST_ENTRY ListEntry)
 {
-       KIRQL OldIrql;
-       PSLIST_ENTRY Value;
-
-       KeAcquireSpinLock(&ExpGlobalInterlockedLock, &OldIrql);
-       Value = ListHead->Next.Next;
-       PushEntryList(&ListHead->Next, ListEntry);
-       ListHead->Depth++;
-       ListHead->Sequence++;
-       KeReleaseSpinLock(&ExpGlobalInterlockedLock, OldIrql);
-       return(Value);
+  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 */