-/* $Id: list.c,v 1.9 2003/07/11 01:23:14 royce 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;
+}
/*
* @implemented
*/
-PLIST_ENTRY STDCALL
+PLIST_ENTRY
+STDCALL
ExInterlockedInsertHeadList(PLIST_ENTRY ListHead,
PLIST_ENTRY ListEntry,
PKSPIN_LOCK Lock)
/*
* @implemented
*/
-PLIST_ENTRY STDCALL
+PLIST_ENTRY
+STDCALL
ExInterlockedInsertTailList(PLIST_ENTRY ListHead,
PLIST_ENTRY ListEntry,
PKSPIN_LOCK Lock)
/*
* @implemented
*/
-PLIST_ENTRY STDCALL
+PLIST_ENTRY
+STDCALL
ExInterlockedRemoveHeadList(PLIST_ENTRY Head,
PKSPIN_LOCK Lock)
/*
PLIST_ENTRY
+STDCALL
ExInterlockedRemoveTailList(PLIST_ENTRY Head,
PKSPIN_LOCK Lock)
/*
}
+#undef ExInterlockedPopEntrySList
+
/*
* @implemented
*/
-PSINGLE_LIST_ENTRY FASTCALL
+PSINGLE_LIST_ENTRY
+FASTCALL
ExInterlockedPopEntrySList(IN PSLIST_HEADER ListHead,
IN PKSPIN_LOCK Lock)
/*
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);
}
+#undef ExInterlockedPushEntrySList
+
/*
* @implemented
*/
-PSINGLE_LIST_ENTRY FASTCALL
+PSINGLE_LIST_ENTRY
+FASTCALL
ExInterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
IN PSINGLE_LIST_ENTRY ListEntry,
IN PKSPIN_LOCK Lock)
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);
}
/*
* @implemented
*/
-PSINGLE_LIST_ENTRY STDCALL
+PSINGLE_LIST_ENTRY
+STDCALL
ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
IN PKSPIN_LOCK Lock)
/*
/*
* @implemented
*/
-PSINGLE_LIST_ENTRY STDCALL
+PSINGLE_LIST_ENTRY
+STDCALL
ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
IN PSINGLE_LIST_ENTRY ListEntry,
IN PKSPIN_LOCK Lock)
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 */