| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- //-------------------------------------------------------------------------------------------------------
- // 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;
- };
|