3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/mm/pager.c
6 * PURPOSE: Moves infrequently used data out of memory
7 * PROGRAMMER: David Welch (welch@cwcom.net)
12 /* INCLUDES ****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/ps.h>
16 #include <internal/ke.h>
17 #include <internal/mm.h>
20 #include <internal/debug.h>
22 /* GLOBALS *******************************************************************/
24 static HANDLE PagerThreadHandle;
25 static CLIENT_ID PagerThreadId;
26 static KEVENT PagerThreadEvent;
27 static BOOLEAN PagerThreadShouldTerminate;
28 static ULONG PagerThreadWorkCount;
30 /* FUNCTIONS *****************************************************************/
35 return(PsGetCurrentThreadId() == PagerThreadId.UniqueThread);
39 MiStartPagerThread(VOID)
43 WasWorking = InterlockedIncrement(&PagerThreadWorkCount);
46 KeSetEvent(&PagerThreadEvent, IO_NO_INCREMENT, FALSE);
51 MiStopPagerThread(VOID)
53 (VOID)InterlockedDecrement(&PagerThreadWorkCount);
56 static NTSTATUS STDCALL
57 MmPagerThreadMain(PVOID Ignored)
63 /* Wake for a low memory situation or a terminate request. */
64 Status = KeWaitForSingleObject(&PagerThreadEvent,
69 if (!NT_SUCCESS(Status))
71 DbgPrint("PagerThread: Wait failed\n");
74 if (PagerThreadShouldTerminate)
76 DbgPrint("PagerThread: Terminating\n");
77 return(STATUS_SUCCESS);
81 /* Try and make some memory available to the system. */
82 MmRebalanceMemoryConsumers();
83 } while(PagerThreadWorkCount > 0);
87 NTSTATUS MmInitPagerThread(VOID)
91 PagerThreadShouldTerminate = FALSE;
92 PagerThreadWorkCount = 0;
93 KeInitializeEvent(&PagerThreadEvent,
97 Status = PsCreateSystemThread(&PagerThreadHandle,
102 (PKSTART_ROUTINE) MmPagerThreadMain,
104 if (!NT_SUCCESS(Status))
109 return(STATUS_SUCCESS);