* PURPOSE: Lookaside lists
* PROGRAMMERS: David Welch (welch@mcmail.com)
* Casper S. Hornstrup (chorns@users.sourceforge.net)
+ * TODO: Use InterlockedXxxEntrySList for binary compatibility
* UPDATE HISTORY:
* 22-05-1998 DW Created
* 02-07-2001 CSH Implemented lookaside lists
/* INCLUDES *****************************************************************/
+//#ifdef __USE_W32API
+// #define NONAMELESSUNION
+//#endif
#include <ddk/ntddk.h>
#include <internal/ex.h>
#define NDEBUG
PLOOKASIDE_MINMAX_ROUTINE ExpMinMaxRoutine;
+#define LookasideListLock(l)(&(l->Obsoleted))
+
/* FUNCTIONS *****************************************************************/
+static
+inline
+PSINGLE_LIST_ENTRY
+ PopEntrySList(
+ PSLIST_HEADER ListHead
+ )
+{
+ PSINGLE_LIST_ENTRY ListEntry;
+
+ ListEntry = ListHead->Next.Next;
+ if (ListEntry!=NULL)
+ {
+ ListHead->Next.Next = ListEntry->Next;
+ ListHead->Depth++;
+ ListHead->Sequence++;
+ }
+ return ListEntry;
+}
+
+
+static
+inline
+VOID
+PushEntrySList (
+ PSLIST_HEADER ListHead,
+ PSINGLE_LIST_ENTRY Entry
+ )
+{
+ Entry->Next = ListHead->Next.Next;
+ ListHead->Next.Next = Entry;
+ ListHead->Depth++;
+ ListHead->Sequence++;
+}
+
+
VOID ExpDefaultMinMax(
POOL_TYPE PoolType,
ULONG Size,
ExpMinMaxRoutine = ExpDefaultMinMax;
}
+
PVOID
-STDCALL
-ExAllocateFromPagedLookasideList (
+FASTCALL
+ExiAllocateFromPagedLookasideList (
PPAGED_LOOKASIDE_LIST Lookaside
)
{
Lookaside->TotalAllocates++;
-// ExAcquireFastMutex(&Lookaside->Lock);
+// ExAcquireFastMutex(LookasideListLock(Lookaside));
Entry = PopEntrySList(&Lookaside->ListHead);
-// ExReleaseFastMutex(&Lookaside->Lock);
+// ExReleaseFastMutex(LookasideListLock(Lookaside));
if (Entry)
return Entry;
return Entry;
}
+
+/*
+ * @implemented
+ */
VOID
STDCALL
ExDeleteNPagedLookasideList (
for them */
while ((Entry = ExInterlockedPopEntrySList(
&Lookaside->ListHead,
- &Lookaside->Lock)) != NULL)
+ LookasideListLock(Lookaside))) != NULL)
{
(*Lookaside->Free)(Entry);
}
KeReleaseSpinLock(&ExpNonPagedLookasideListLock, OldIrql);
}
+
+/*
+ * @implemented
+ */
VOID
STDCALL
ExDeletePagedLookasideList (
for (;;)
{
-// ExAcquireFastMutex(&Lookaside->Lock);
+// ExAcquireFastMutex(LookasideListLock(Lookaside));
Entry = PopEntrySList(&Lookaside->ListHead);
if (!Entry)
break;
-// ExReleaseFastMutex(&Lookaside->Lock);
+// ExReleaseFastMutex(LookasideListLock(Lookaside));
(*Lookaside->Free)(Entry);
}
KeReleaseSpinLock(&ExpPagedLookasideListLock, OldIrql);
}
+
VOID
STDCALL
-ExFreeToPagedLookasideList (
+ExiFreeToPagedLookasideList (
PPAGED_LOOKASIDE_LIST Lookaside,
PVOID Entry
)
{
Lookaside->TotalFrees++;
- if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->MinimumDepth)
+ if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth)
{
Lookaside->FreeMisses++;
(*Lookaside->Free)(Entry);
}
else
{
-// ExAcquireFastMutex(&Lookaside->Lock);
+// ExAcquireFastMutex(LookasideListLock(Lookaside));
PushEntrySList(&Lookaside->ListHead, (PSINGLE_LIST_ENTRY)Entry);
-// ExReleaseFastMutex(&Lookaside->Lock);
+// ExReleaseFastMutex(LookasideListLock(Lookaside));
}
}
+
+/*
+ * @implemented
+ */
VOID
STDCALL
ExInitializeNPagedLookasideList (
Lookaside->Free = ExpDefaultFree;
ExInitializeSListHead(&Lookaside->ListHead);
- KeInitializeSpinLock(&Lookaside->Lock);
+ KeInitializeSpinLock(LookasideListLock(Lookaside));
/* Determine minimum and maximum number of entries on the lookaside list
using the configured algorithm */
(*ExpMinMaxRoutine)(
NonPagedPool,
Lookaside->Size,
- &Lookaside->MinimumDepth,
+ &Lookaside->Depth,
&Lookaside->MaximumDepth);
ExInterlockedInsertTailList(
&ExpNonPagedLookasideListLock);
}
+
+/*
+ * @implemented
+ */
VOID
STDCALL
ExInitializePagedLookasideList (
Lookaside->Free = ExpDefaultFree;
ExInitializeSListHead(&Lookaside->ListHead);
- //ExInitializeFastMutex(&Lookaside->Lock);
+ //ExInitializeFastMutex(LookasideListLock(Lookaside));
/* Determine minimum and maximum number of entries on the lookaside list
using the configured algorithm */
(*ExpMinMaxRoutine)(
PagedPool,
Lookaside->Size,
- &Lookaside->MinimumDepth,
+ &Lookaside->Depth,
&Lookaside->MaximumDepth);
ExInterlockedInsertTailList(