blob: 0a4147eb5109ad993feb134816917f79e9458081 [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#pragma once
class PageAllocatorPool
{
friend class AutoReturnPageAllocator;
public:
PageAllocatorPool();
~PageAllocatorPool();
void RemoveAll();
static void Initialize();
static void Shutdown();
static void IdleCleanup();
private:
static VOID CALLBACK IdleCleanupRoutine(
_Inout_ PTP_CALLBACK_INSTANCE Instance,
_Inout_opt_ PVOID Context,
_Inout_ PTP_TIMER Timer);
PageAllocator* GetPageAllocator();
void ReturnPageAllocator(PageAllocator* pageAllocator);
unsigned int GetInactivePageAllocatorCount();
SList<PageAllocator*, NoThrowHeapAllocator, RealCount> pageAllocators;
static CriticalSection cs;
static PageAllocatorPool* Instance;
PTP_TIMER idleCleanupTimer;
volatile unsigned long long activePageAllocatorCount;
};
class AutoReturnPageAllocator
{
public:
AutoReturnPageAllocator() :pageAllocator(nullptr) {}
~AutoReturnPageAllocator()
{
if (pageAllocator)
{
PageAllocatorPool::Instance->ReturnPageAllocator(pageAllocator);
}
}
PageAllocator* GetPageAllocator()
{
if (pageAllocator == nullptr)
{
pageAllocator = PageAllocatorPool::Instance->GetPageAllocator();
}
return pageAllocator;
}
private:
PageAllocator* pageAllocator;
};