other-licenses/7zstub/src/Common/Alloc.cpp

branch
TOR_BUG_9701
changeset 14
925c144e1f1f
equal deleted inserted replaced
-1:000000000000 0:3a08dc9853a7
1 // Common/Alloc.cpp
2
3 #include "StdAfx.h"
4
5 #ifdef _WIN32
6 #include "MyWindows.h"
7 #else
8 #include <stdlib.h>
9 #endif
10
11 #include "Alloc.h"
12
13 /* #define _SZ_ALLOC_DEBUG */
14 /* use _SZ_ALLOC_DEBUG to debug alloc/free operations */
15 #ifdef _SZ_ALLOC_DEBUG
16 #include <stdio.h>
17 int g_allocCount = 0;
18 int g_allocCountMid = 0;
19 int g_allocCountBig = 0;
20 #endif
21
22 void *MyAlloc(size_t size) throw()
23 {
24 if (size == 0)
25 return 0;
26 #ifdef _SZ_ALLOC_DEBUG
27 fprintf(stderr, "\nAlloc %10d bytes; count = %10d", size, g_allocCount++);
28 #endif
29 return ::malloc(size);
30 }
31
32 void MyFree(void *address) throw()
33 {
34 #ifdef _SZ_ALLOC_DEBUG
35 if (address != 0)
36 fprintf(stderr, "\nFree; count = %10d", --g_allocCount);
37 #endif
38
39 ::free(address);
40 }
41
42 #ifdef _WIN32
43
44 void *MidAlloc(size_t size) throw()
45 {
46 if (size == 0)
47 return 0;
48 #ifdef _SZ_ALLOC_DEBUG
49 fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++);
50 #endif
51 return ::VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE);
52 }
53
54 void MidFree(void *address) throw()
55 {
56 #ifdef _SZ_ALLOC_DEBUG
57 if (address != 0)
58 fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid);
59 #endif
60 if (address == 0)
61 return;
62 ::VirtualFree(address, 0, MEM_RELEASE);
63 }
64
65 static SIZE_T g_LargePageSize =
66 #ifdef _WIN64
67 (1 << 21);
68 #else
69 (1 << 22);
70 #endif
71
72 typedef SIZE_T (WINAPI *GetLargePageMinimumP)();
73
74 bool SetLargePageSize()
75 {
76 GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP)
77 ::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum");
78 if (largePageMinimum == 0)
79 return false;
80 SIZE_T size = largePageMinimum();
81 if (size == 0 || (size & (size - 1)) != 0)
82 return false;
83 g_LargePageSize = size;
84 return true;
85 }
86
87
88 void *BigAlloc(size_t size) throw()
89 {
90 if (size == 0)
91 return 0;
92 #ifdef _SZ_ALLOC_DEBUG
93 fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++);
94 #endif
95
96 if (size >= (1 << 18))
97 {
98 void *res = ::VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)),
99 MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE);
100 if (res != 0)
101 return res;
102 }
103 return ::VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE);
104 }
105
106 void BigFree(void *address) throw()
107 {
108 #ifdef _SZ_ALLOC_DEBUG
109 if (address != 0)
110 fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig);
111 #endif
112
113 if (address == 0)
114 return;
115 ::VirtualFree(address, 0, MEM_RELEASE);
116 }
117
118 #endif

mercurial