Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Side by Side Diff: xfa/fgas/crt/fgas_memory.cpp

Issue 2328403002: Fix some leaks associated with memory allocator (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "xfa/fgas/crt/fgas_memory.h" 7 #include "xfa/fgas/crt/fgas_memory.h"
8 8
9 #ifndef MEMORY_TOOL_REPLACES_ALLOCATOR 9 #ifndef MEMORY_TOOL_REPLACES_ALLOCATOR
10 #define MEMORY_TOOL_REPLACES_ALLOCATOR // Temporary, for CF testing. 10 #define MEMORY_TOOL_REPLACES_ALLOCATOR // Temporary, for CF testing.
Tom Sepez 2016/09/12 18:18:05 This line is kinda troubling (I probably did it).
Wei Li 2016/09/12 21:39:21 Hope it is better now
11 #endif 11 #endif
12 12
13 #include <algorithm> 13 #include <algorithm>
14 14
15 #ifdef MEMORY_TOOL_REPLACES_ALLOCATOR
16
17 namespace {
18
19 class CFX_DefStore : public IFX_MemoryAllocator, public CFX_Target {
20 public:
21 CFX_DefStore() {}
22 ~CFX_DefStore() override {}
23
24 void* Alloc(size_t size) override { return FX_Alloc(uint8_t, size); }
25 void Free(void* pBlock) override { FX_Free(pBlock); }
26 };
27
28 } // namespace
29
30 std::unique_ptr<IFX_MemoryAllocator> IFX_MemoryAllocator::Create(
31 FX_ALLOCTYPE eType,
32 size_t chunkSize,
33 size_t blockSize) {
34 return std::unique_ptr<IFX_MemoryAllocator>(new CFX_DefStore());
35 }
36
37 #else // MEMORY_TOOL_REPLACES_ALLOCATOR
38
39 namespace { 15 namespace {
40 16
41 struct FX_STATICSTORECHUNK { 17 struct FX_STATICSTORECHUNK {
42 FX_STATICSTORECHUNK* pNextChunk; 18 FX_STATICSTORECHUNK* pNextChunk;
43 size_t iChunkSize; 19 size_t iChunkSize;
44 size_t iFreeSize; 20 size_t iFreeSize;
45 }; 21 };
46 22
47 class CFX_StaticStore : public IFX_MemoryAllocator, public CFX_Target { 23 class CFX_StaticStore : public IFX_MemoryAllocator, public CFX_Target {
48 public: 24 public:
49 CFX_StaticStore(size_t iDefChunkSize); 25 CFX_StaticStore(size_t iDefChunkSize);
50 ~CFX_StaticStore() override; 26 ~CFX_StaticStore() override;
51 27
52 void* Alloc(size_t size) override; 28 void* Alloc(size_t size) override;
53 void Free(void* pBlock) override {} 29 void Free(void* pBlock) override {}
54 30
55 private: 31 private:
56 size_t m_iAllocatedSize; 32 size_t m_iAllocatedSize;
57 size_t m_iDefChunkSize; 33 size_t m_iDefChunkSize;
58 FX_STATICSTORECHUNK* m_pChunk; 34 FX_STATICSTORECHUNK* m_pChunk;
59 FX_STATICSTORECHUNK* m_pLastChunk; 35 FX_STATICSTORECHUNK* m_pLastChunk;
60 FX_STATICSTORECHUNK* AllocChunk(size_t size); 36 FX_STATICSTORECHUNK* AllocChunk(size_t size);
61 FX_STATICSTORECHUNK* FindChunk(size_t size); 37 FX_STATICSTORECHUNK* FindChunk(size_t size);
62 }; 38 };
63 39
40 #ifdef MEMORY_TOOL_REPLACES_ALLOCATOR
41
42 class CFX_DefStore : public IFX_MemoryAllocator, public CFX_Target {
43 public:
44 CFX_DefStore() {}
45 ~CFX_DefStore() override {}
46
47 void* Alloc(size_t size) override { return FX_Alloc(uint8_t, size); }
48 void Free(void* pBlock) override { FX_Free(pBlock); }
49 };
50
51 #else
52
64 struct FX_FIXEDSTORECHUNK { 53 struct FX_FIXEDSTORECHUNK {
65 uint8_t* FirstFlag() { return reinterpret_cast<uint8_t*>(this + 1); } 54 uint8_t* FirstFlag() { return reinterpret_cast<uint8_t*>(this + 1); }
66 uint8_t* FirstBlock() { return FirstFlag() + iChunkSize; } 55 uint8_t* FirstBlock() { return FirstFlag() + iChunkSize; }
67 56
68 FX_FIXEDSTORECHUNK* pNextChunk; 57 FX_FIXEDSTORECHUNK* pNextChunk;
69 size_t iChunkSize; 58 size_t iChunkSize;
70 size_t iFreeNum; 59 size_t iFreeNum;
71 }; 60 };
72 61
73 class CFX_FixedStore : public IFX_MemoryAllocator, public CFX_Target { 62 class CFX_FixedStore : public IFX_MemoryAllocator, public CFX_Target {
74 public: 63 public:
75 CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk); 64 CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk);
76 ~CFX_FixedStore() override; 65 ~CFX_FixedStore() override;
77 void* Alloc(size_t size) override; 66 void* Alloc(size_t size) override;
78 void Free(void* pBlock) override; 67 void Free(void* pBlock) override;
79 68
80 private: 69 private:
81 FX_FIXEDSTORECHUNK* AllocChunk(); 70 FX_FIXEDSTORECHUNK* AllocChunk();
82 71
83 size_t m_iBlockSize; 72 size_t m_iBlockSize;
84 size_t m_iDefChunkSize; 73 size_t m_iDefChunkSize;
85 FX_FIXEDSTORECHUNK* m_pChunk; 74 FX_FIXEDSTORECHUNK* m_pChunk;
86 }; 75 };
87 76
77 #endif // MEMORY_TOOL_REPLACES_ALLOCATOR
78
88 } // namespace 79 } // namespace
89 80
90 #define FX_4BYTEALIGN(size) (((size) + 3) & ~3) 81 #define FX_4BYTEALIGN(size) (((size) + 3) & ~3)
91 82
92 std::unique_ptr<IFX_MemoryAllocator> IFX_MemoryAllocator::Create( 83 std::unique_ptr<IFX_MemoryAllocator> IFX_MemoryAllocator::Create(
93 FX_ALLOCTYPE eType, 84 FX_ALLOCTYPE eType,
94 size_t chunkSize, 85 size_t chunkSize,
95 size_t blockSize) { 86 size_t blockSize) {
96 switch (eType) { 87 switch (eType) {
97 case FX_ALLOCTYPE_Static: 88 case FX_ALLOCTYPE_Static:
98 return std::unique_ptr<IFX_MemoryAllocator>( 89 return std::unique_ptr<IFX_MemoryAllocator>(
99 new CFX_StaticStore(chunkSize)); 90 new CFX_StaticStore(chunkSize));
100 case FX_ALLOCTYPE_Fixed: 91 case FX_ALLOCTYPE_Fixed:
101 return std::unique_ptr<IFX_MemoryAllocator>(new CFX_FixedStore(blockSize, chunkSize); 92 #ifdef MEMORY_TOOL_REPLACES_ALLOCATOR
93 return std::unique_ptr<IFX_MemoryAllocator>(new CFX_DefStore());
94 #else
95 return std::unique_ptr<IFX_MemoryAllocator>(
96 new CFX_FixedStore(blockSize, chunkSize));
97 #endif // MEMORY_TOOL_REPLACES_ALLOCATOR
102 default: 98 default:
103 ASSERT(0); 99 ASSERT(0);
104 return std::unique_ptr<IFX_MemoryAllocator>(); 100 return std::unique_ptr<IFX_MemoryAllocator>();
105 } 101 }
106 } 102 }
107 103
108 CFX_StaticStore::CFX_StaticStore(size_t iDefChunkSize) 104 CFX_StaticStore::CFX_StaticStore(size_t iDefChunkSize)
109 : m_iAllocatedSize(0), 105 : m_iAllocatedSize(0),
110 m_iDefChunkSize(iDefChunkSize), 106 m_iDefChunkSize(iDefChunkSize),
111 m_pChunk(nullptr), 107 m_pChunk(nullptr),
112 m_pLastChunk(nullptr) { 108 m_pLastChunk(nullptr) {
113 ASSERT(m_iDefChunkSize != 0); 109 ASSERT(m_iDefChunkSize != 0);
114 } 110 }
111
115 CFX_StaticStore::~CFX_StaticStore() { 112 CFX_StaticStore::~CFX_StaticStore() {
116 FX_STATICSTORECHUNK* pChunk = m_pChunk; 113 FX_STATICSTORECHUNK* pChunk = m_pChunk;
117 while (pChunk) { 114 while (pChunk) {
118 FX_STATICSTORECHUNK* pNext = pChunk->pNextChunk; 115 FX_STATICSTORECHUNK* pNext = pChunk->pNextChunk;
119 FX_Free(pChunk); 116 FX_Free(pChunk);
120 pChunk = pNext; 117 pChunk = pNext;
121 } 118 }
122 } 119 }
120
123 FX_STATICSTORECHUNK* CFX_StaticStore::AllocChunk(size_t size) { 121 FX_STATICSTORECHUNK* CFX_StaticStore::AllocChunk(size_t size) {
124 ASSERT(size != 0); 122 ASSERT(size != 0);
125 FX_STATICSTORECHUNK* pChunk = (FX_STATICSTORECHUNK*)FX_Alloc( 123 FX_STATICSTORECHUNK* pChunk = (FX_STATICSTORECHUNK*)FX_Alloc(
126 uint8_t, sizeof(FX_STATICSTORECHUNK) + size); 124 uint8_t, sizeof(FX_STATICSTORECHUNK) + size);
127 pChunk->iChunkSize = size; 125 pChunk->iChunkSize = size;
128 pChunk->iFreeSize = size; 126 pChunk->iFreeSize = size;
129 pChunk->pNextChunk = nullptr; 127 pChunk->pNextChunk = nullptr;
130 if (!m_pLastChunk) { 128 if (!m_pLastChunk) {
131 m_pChunk = pChunk; 129 m_pChunk = pChunk;
132 } else { 130 } else {
133 m_pLastChunk->pNextChunk = pChunk; 131 m_pLastChunk->pNextChunk = pChunk;
134 } 132 }
135 m_pLastChunk = pChunk; 133 m_pLastChunk = pChunk;
136 return pChunk; 134 return pChunk;
137 } 135 }
136
138 FX_STATICSTORECHUNK* CFX_StaticStore::FindChunk(size_t size) { 137 FX_STATICSTORECHUNK* CFX_StaticStore::FindChunk(size_t size) {
139 ASSERT(size != 0); 138 ASSERT(size != 0);
140 if (!m_pLastChunk || m_pLastChunk->iFreeSize < size) { 139 if (!m_pLastChunk || m_pLastChunk->iFreeSize < size) {
141 return AllocChunk(std::max(m_iDefChunkSize, size)); 140 return AllocChunk(std::max(m_iDefChunkSize, size));
142 } 141 }
143 return m_pLastChunk; 142 return m_pLastChunk;
144 } 143 }
144
145 void* CFX_StaticStore::Alloc(size_t size) { 145 void* CFX_StaticStore::Alloc(size_t size) {
146 size = FX_4BYTEALIGN(size); 146 size = FX_4BYTEALIGN(size);
147 ASSERT(size != 0); 147 ASSERT(size != 0);
148 FX_STATICSTORECHUNK* pChunk = FindChunk(size); 148 FX_STATICSTORECHUNK* pChunk = FindChunk(size);
149 ASSERT(pChunk->iFreeSize >= size); 149 ASSERT(pChunk->iFreeSize >= size);
150 uint8_t* p = (uint8_t*)pChunk; 150 uint8_t* p = (uint8_t*)pChunk;
151 p += sizeof(FX_STATICSTORECHUNK) + pChunk->iChunkSize - pChunk->iFreeSize; 151 p += sizeof(FX_STATICSTORECHUNK) + pChunk->iChunkSize - pChunk->iFreeSize;
152 pChunk->iFreeSize -= size; 152 pChunk->iFreeSize -= size;
153 m_iAllocatedSize += size; 153 m_iAllocatedSize += size;
154 return p; 154 return p;
155 } 155 }
156 size_t CFX_StaticStore::SetDefChunkSize(size_t size) { 156
157 ASSERT(size != 0); 157 #ifndef MEMORY_TOOL_REPLACES_ALLOCATOR
158 size_t v = m_iDefChunkSize; 158
159 m_iDefChunkSize = size;
160 return v;
161 }
162 CFX_FixedStore::CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk) 159 CFX_FixedStore::CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk)
163 : m_iBlockSize(FX_4BYTEALIGN(iBlockSize)), 160 : m_iBlockSize(FX_4BYTEALIGN(iBlockSize)),
164 m_iDefChunkSize(FX_4BYTEALIGN(iBlockNumsInChunk)), 161 m_iDefChunkSize(FX_4BYTEALIGN(iBlockNumsInChunk)),
165 m_pChunk(nullptr) { 162 m_pChunk(nullptr) {
166 ASSERT(m_iBlockSize != 0 && m_iDefChunkSize != 0); 163 ASSERT(m_iBlockSize != 0 && m_iDefChunkSize != 0);
167 } 164 }
165
168 CFX_FixedStore::~CFX_FixedStore() { 166 CFX_FixedStore::~CFX_FixedStore() {
169 FX_FIXEDSTORECHUNK* pChunk = m_pChunk; 167 FX_FIXEDSTORECHUNK* pChunk = m_pChunk;
170 while (pChunk) { 168 while (pChunk) {
171 FX_FIXEDSTORECHUNK* pNext = pChunk->pNextChunk; 169 FX_FIXEDSTORECHUNK* pNext = pChunk->pNextChunk;
172 FX_Free(pChunk); 170 FX_Free(pChunk);
173 pChunk = pNext; 171 pChunk = pNext;
174 } 172 }
175 } 173 }
174
176 FX_FIXEDSTORECHUNK* CFX_FixedStore::AllocChunk() { 175 FX_FIXEDSTORECHUNK* CFX_FixedStore::AllocChunk() {
177 int32_t iTotalSize = sizeof(FX_FIXEDSTORECHUNK) + m_iDefChunkSize + 176 int32_t iTotalSize = sizeof(FX_FIXEDSTORECHUNK) + m_iDefChunkSize +
178 m_iBlockSize * m_iDefChunkSize; 177 m_iBlockSize * m_iDefChunkSize;
179 FX_FIXEDSTORECHUNK* pChunk = 178 FX_FIXEDSTORECHUNK* pChunk =
180 (FX_FIXEDSTORECHUNK*)FX_Alloc(uint8_t, iTotalSize); 179 (FX_FIXEDSTORECHUNK*)FX_Alloc(uint8_t, iTotalSize);
181 if (!pChunk) 180 if (!pChunk)
182 return nullptr; 181 return nullptr;
183 182
184 FXSYS_memset(pChunk->FirstFlag(), 0, m_iDefChunkSize); 183 FXSYS_memset(pChunk->FirstFlag(), 0, m_iDefChunkSize);
185 pChunk->pNextChunk = m_pChunk; 184 pChunk->pNextChunk = m_pChunk;
186 pChunk->iChunkSize = m_iDefChunkSize; 185 pChunk->iChunkSize = m_iDefChunkSize;
187 pChunk->iFreeNum = m_iDefChunkSize; 186 pChunk->iFreeNum = m_iDefChunkSize;
188 m_pChunk = pChunk; 187 m_pChunk = pChunk;
189 return pChunk; 188 return pChunk;
190 } 189 }
190
191 void* CFX_FixedStore::Alloc(size_t size) { 191 void* CFX_FixedStore::Alloc(size_t size) {
192 if (size > m_iBlockSize) { 192 if (size > m_iBlockSize) {
193 return nullptr; 193 return nullptr;
194 } 194 }
195 FX_FIXEDSTORECHUNK* pChunk = m_pChunk; 195 FX_FIXEDSTORECHUNK* pChunk = m_pChunk;
196 while (pChunk) { 196 while (pChunk) {
197 if (pChunk->iFreeNum > 0) { 197 if (pChunk->iFreeNum > 0) {
198 break; 198 break;
199 } 199 }
200 pChunk = pChunk->pNextChunk; 200 pChunk = pChunk->pNextChunk;
201 } 201 }
202 if (!pChunk) { 202 if (!pChunk) {
203 pChunk = AllocChunk(); 203 pChunk = AllocChunk();
204 } 204 }
205 uint8_t* pFlags = pChunk->FirstFlag(); 205 uint8_t* pFlags = pChunk->FirstFlag();
206 size_t i = 0; 206 size_t i = 0;
207 for (; i < pChunk->iChunkSize; i++) 207 for (; i < pChunk->iChunkSize; i++)
208 if (pFlags[i] == 0) { 208 if (pFlags[i] == 0) {
209 break; 209 break;
210 } 210 }
211 ASSERT(i < pChunk->iChunkSize); 211 ASSERT(i < pChunk->iChunkSize);
212 pFlags[i] = 1; 212 pFlags[i] = 1;
213 pChunk->iFreeNum--; 213 pChunk->iFreeNum--;
214 return pChunk->FirstBlock() + i * m_iBlockSize; 214 return pChunk->FirstBlock() + i * m_iBlockSize;
215 } 215 }
216
216 void CFX_FixedStore::Free(void* pBlock) { 217 void CFX_FixedStore::Free(void* pBlock) {
217 FX_FIXEDSTORECHUNK* pPrior = nullptr; 218 FX_FIXEDSTORECHUNK* pPrior = nullptr;
218 FX_FIXEDSTORECHUNK* pChunk = m_pChunk; 219 FX_FIXEDSTORECHUNK* pChunk = m_pChunk;
219 uint8_t* pStart = nullptr; 220 uint8_t* pStart = nullptr;
220 uint8_t* pEnd; 221 uint8_t* pEnd;
221 while (pChunk) { 222 while (pChunk) {
222 pStart = pChunk->FirstBlock(); 223 pStart = pChunk->FirstBlock();
223 if (pBlock >= pStart) { 224 if (pBlock >= pStart) {
224 pEnd = pStart + m_iBlockSize * pChunk->iChunkSize; 225 pEnd = pStart + m_iBlockSize * pChunk->iChunkSize;
225 if (pBlock < pEnd) { 226 if (pBlock < pEnd) {
(...skipping 13 matching lines...) Expand all
239 pChunk->iFreeNum++; 240 pChunk->iFreeNum++;
240 if (pChunk->iFreeNum == pChunk->iChunkSize) { 241 if (pChunk->iFreeNum == pChunk->iChunkSize) {
241 if (!pPrior) { 242 if (!pPrior) {
242 m_pChunk = pChunk->pNextChunk; 243 m_pChunk = pChunk->pNextChunk;
243 } else { 244 } else {
244 pPrior->pNextChunk = pChunk->pNextChunk; 245 pPrior->pNextChunk = pChunk->pNextChunk;
245 } 246 }
246 FX_Free(pChunk); 247 FX_Free(pChunk);
247 } 248 }
248 } 249 }
249 size_t CFX_FixedStore::SetDefChunkSize(size_t iChunkSize) {
250 ASSERT(iChunkSize != 0);
251 size_t v = m_iDefChunkSize;
252 m_iDefChunkSize = FX_4BYTEALIGN(iChunkSize);
253 return v;
254 }
255 250
256 #endif // MEMORY_TOOL_REPLACES_ALLOCATOR 251 #endif // MEMORY_TOOL_REPLACES_ALLOCATOR
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698