update for HEAD-2003091401
[reactos.git] / ntoskrnl / ex / lookas.c
index ef82f83..f38c5c7 100644 (file)
@@ -6,6 +6,7 @@
  * 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
@@ -13,6 +14,9 @@
 
 /* INCLUDES *****************************************************************/
 
+//#ifdef __USE_W32API
+// #define NONAMELESSUNION
+//#endif
 #include <ddk/ntddk.h>
 #include <internal/ex.h>
 #define NDEBUG
@@ -28,8 +32,45 @@ KSPIN_LOCK ExpPagedLookasideListLock;
 
 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,
@@ -102,9 +143,10 @@ ExpInitLookasideLists()
   ExpMinMaxRoutine = ExpDefaultMinMax;
 }
 
+
 PVOID
-STDCALL
-ExAllocateFromPagedLookasideList (
+FASTCALL
+ExiAllocateFromPagedLookasideList (
        PPAGED_LOOKASIDE_LIST   Lookaside
        )
 {
@@ -115,11 +157,11 @@ ExAllocateFromPagedLookasideList (
 
   Lookaside->TotalAllocates++;
 
-//  ExAcquireFastMutex(&Lookaside->Lock);
+//  ExAcquireFastMutex(LookasideListLock(Lookaside));
 
   Entry = PopEntrySList(&Lookaside->ListHead);
 
-//  ExReleaseFastMutex(&Lookaside->Lock);
+//  ExReleaseFastMutex(LookasideListLock(Lookaside));
 
   if (Entry)
     return Entry;
@@ -133,6 +175,10 @@ ExAllocateFromPagedLookasideList (
   return Entry;
 }
 
+
+/*
+ * @implemented
+ */
 VOID
 STDCALL
 ExDeleteNPagedLookasideList (
@@ -146,7 +192,7 @@ ExDeleteNPagedLookasideList (
      for them */
   while ((Entry = ExInterlockedPopEntrySList(
     &Lookaside->ListHead,
-    &Lookaside->Lock)) != NULL)
+    LookasideListLock(Lookaside))) != NULL)
   {
     (*Lookaside->Free)(Entry);
   }
@@ -156,6 +202,10 @@ ExDeleteNPagedLookasideList (
   KeReleaseSpinLock(&ExpNonPagedLookasideListLock, OldIrql);
 }
 
+
+/*
+ * @implemented
+ */
 VOID
 STDCALL
 ExDeletePagedLookasideList (
@@ -170,13 +220,13 @@ ExDeletePagedLookasideList (
   for (;;)
   {
 
-//  ExAcquireFastMutex(&Lookaside->Lock);
+//  ExAcquireFastMutex(LookasideListLock(Lookaside));
 
     Entry = PopEntrySList(&Lookaside->ListHead);
     if (!Entry)
       break;
 
-//  ExReleaseFastMutex(&Lookaside->Lock);
+//  ExReleaseFastMutex(LookasideListLock(Lookaside));
 
     (*Lookaside->Free)(Entry);
   }
@@ -186,28 +236,33 @@ ExDeletePagedLookasideList (
   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 (
@@ -246,14 +301,14 @@ 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(
@@ -262,6 +317,10 @@ ExInitializeNPagedLookasideList (
     &ExpNonPagedLookasideListLock);
 }
 
+
+/*
+ * @implemented
+ */
 VOID
 STDCALL
 ExInitializePagedLookasideList (
@@ -301,14 +360,14 @@ 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(