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