-/* $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)
/*
* @implemented
*/
-PLIST_ENTRY FASTCALL
+PLIST_ENTRY
+STDCALL
ExInterlockedInsertTailList(PLIST_ENTRY ListHead,
PLIST_ENTRY ListEntry,
PKSPIN_LOCK Lock)
/*
* @implemented
*/
-PLIST_ENTRY FASTCALL
+PLIST_ENTRY
+STDCALL
ExInterlockedRemoveHeadList(PLIST_ENTRY Head,
PKSPIN_LOCK Lock)
/*
PLIST_ENTRY
+STDCALL
ExInterlockedRemoveTailList(PLIST_ENTRY Head,
PKSPIN_LOCK Lock)
/*
}
-#ifdef ExInterlockedPopEntrySList
#undef ExInterlockedPopEntrySList
-#endif
/*
* @implemented
*/
-PSINGLE_LIST_ENTRY FASTCALL
+PSINGLE_LIST_ENTRY
+FASTCALL
ExInterlockedPopEntrySList(IN PSLIST_HEADER ListHead,
IN PKSPIN_LOCK Lock)
/*
}
-#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)
/*
* @implemented
*/
-PSINGLE_LIST_ENTRY FASTCALL
+PSINGLE_LIST_ENTRY
+STDCALL
ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
IN PKSPIN_LOCK Lock)
/*
/*
* @implemented
*/
-PSINGLE_LIST_ENTRY FASTCALL
+PSINGLE_LIST_ENTRY
+STDCALL
ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
IN PSINGLE_LIST_ENTRY ListEntry,
IN PKSPIN_LOCK Lock)
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;
}
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 */