6 #include "MyWindows.h"
\r
13 /* #define _SZ_ALLOC_DEBUG */
\r
14 /* use _SZ_ALLOC_DEBUG to debug alloc/free operations */
\r
15 #ifdef _SZ_ALLOC_DEBUG
\r
17 int g_allocCount = 0;
\r
18 int g_allocCountMid = 0;
\r
19 int g_allocCountBig = 0;
\r
22 void *MyAlloc(size_t size) throw()
\r
26 #ifdef _SZ_ALLOC_DEBUG
\r
27 fprintf(stderr, "\nAlloc %10d bytes; count = %10d", size, g_allocCount++);
\r
29 return ::malloc(size);
\r
32 void MyFree(void *address) throw()
\r
34 #ifdef _SZ_ALLOC_DEBUG
\r
36 fprintf(stderr, "\nFree; count = %10d", --g_allocCount);
\r
44 void *MidAlloc(size_t size) throw()
\r
48 #ifdef _SZ_ALLOC_DEBUG
\r
49 fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++);
\r
51 return ::VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE);
\r
54 void MidFree(void *address) throw()
\r
56 #ifdef _SZ_ALLOC_DEBUG
\r
58 fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid);
\r
62 ::VirtualFree(address, 0, MEM_RELEASE);
\r
65 static SIZE_T g_LargePageSize =
\r
72 typedef SIZE_T (WINAPI *GetLargePageMinimumP)();
\r
74 bool SetLargePageSize()
\r
76 GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP)
\r
77 ::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum");
\r
78 if (largePageMinimum == 0)
\r
80 SIZE_T size = largePageMinimum();
\r
81 if (size == 0 || (size & (size - 1)) != 0)
\r
83 g_LargePageSize = size;
\r
88 void *BigAlloc(size_t size) throw()
\r
92 #ifdef _SZ_ALLOC_DEBUG
\r
93 fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++);
\r
96 if (size >= (1 << 18))
\r
98 void *res = ::VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)),
\r
99 MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE);
\r
103 return ::VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE);
\r
106 void BigFree(void *address) throw()
\r
108 #ifdef _SZ_ALLOC_DEBUG
\r
110 fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig);
\r
115 ::VirtualFree(address, 0, MEM_RELEASE);
\r