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

Side by Side Diff: Source/wtf/PartitionAlloc.cpp

Issue 658113002: PartitionAlloc: Remove the 2 GB per-partition address space limit (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: address nits Created 6 years, 2 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 | « Source/wtf/PartitionAlloc.h ('k') | 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 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 246
247 return noLeaks; 247 return noLeaks;
248 } 248 }
249 249
250 static void partitionAllocBaseShutdown(PartitionRootBase* root) 250 static void partitionAllocBaseShutdown(PartitionRootBase* root)
251 { 251 {
252 ASSERT(root->initialized); 252 ASSERT(root->initialized);
253 root->initialized = false; 253 root->initialized = false;
254 254
255 // Now that we've examined all partition pages in all buckets, it's safe 255 // Now that we've examined all partition pages in all buckets, it's safe
256 // to free all our super pages. We first collect the super page pointers 256 // to free all our super pages. Since the super page extent entries are
257 // on the stack because some of them are themselves store in super pages. 257 // stored in the super pages, we need to be careful not to access them
258 char* superPages[kMaxPartitionSize / kSuperPageSize]; 258 // after we've released the corresponding super page.
259 size_t numSuperPages = 0;
260 PartitionSuperPageExtentEntry* entry = root->firstExtent; 259 PartitionSuperPageExtentEntry* entry = root->firstExtent;
261 while (entry) { 260 while (entry) {
261 PartitionSuperPageExtentEntry* nextEntry = entry->next;
262 char* superPage = entry->superPageBase; 262 char* superPage = entry->superPageBase;
263 while (superPage != entry->superPagesEnd) { 263 char* superPagesEnd = entry->superPagesEnd;
264 superPages[numSuperPages] = superPage; 264 while (superPage < superPagesEnd) {
265 numSuperPages++; 265 freePages(superPage, kSuperPageSize);
266 superPage += kSuperPageSize; 266 superPage += kSuperPageSize;
267 } 267 }
268 entry = entry->next; 268 entry = nextEntry;
269 } 269 }
270 ASSERT(numSuperPages == root->totalSizeOfSuperPages / kSuperPageSize);
271 for (size_t i = 0; i < numSuperPages; ++i)
272 freePages(superPages[i], kSuperPageSize);
273 } 270 }
274 271
275 bool partitionAllocShutdown(PartitionRoot* root) 272 bool partitionAllocShutdown(PartitionRoot* root)
276 { 273 {
277 bool noLeaks = true; 274 bool noLeaks = true;
278 size_t i; 275 size_t i;
279 for (i = 0; i < root->numBuckets; ++i) { 276 for (i = 0; i < root->numBuckets; ++i) {
280 PartitionBucket* bucket = &root->buckets()[i]; 277 PartitionBucket* bucket = &root->buckets()[i];
281 if (!partitionAllocShutdownBucket(bucket)) 278 if (!partitionAllocShutdownBucket(bucket))
282 noLeaks = false; 279 noLeaks = false;
(...skipping 14 matching lines...) Expand all
297 } 294 }
298 partitionAllocBaseShutdown(root); 295 partitionAllocBaseShutdown(root);
299 return noLeaks; 296 return noLeaks;
300 } 297 }
301 298
302 static NEVER_INLINE void partitionOutOfMemory() 299 static NEVER_INLINE void partitionOutOfMemory()
303 { 300 {
304 IMMEDIATE_CRASH(); 301 IMMEDIATE_CRASH();
305 } 302 }
306 303
307 static NEVER_INLINE void partitionFull()
308 {
309 IMMEDIATE_CRASH();
310 }
311
312 static ALWAYS_INLINE void partitionDecommitSystemPages(PartitionRootBase* root, void* addr, size_t len) 304 static ALWAYS_INLINE void partitionDecommitSystemPages(PartitionRootBase* root, void* addr, size_t len)
313 { 305 {
314 decommitSystemPages(addr, len); 306 decommitSystemPages(addr, len);
315 ASSERT(root->totalSizeOfCommittedPages > len); 307 ASSERT(root->totalSizeOfCommittedPages > len);
316 root->totalSizeOfCommittedPages -= len; 308 root->totalSizeOfCommittedPages -= len;
317 } 309 }
318 310
319 static ALWAYS_INLINE void partitionRecommitSystemPages(PartitionRootBase* root, void* addr, size_t len) 311 static ALWAYS_INLINE void partitionRecommitSystemPages(PartitionRootBase* root, void* addr, size_t len)
320 { 312 {
321 recommitSystemPages(addr, len); 313 recommitSystemPages(addr, len);
(...skipping 11 matching lines...) Expand all
333 if (LIKELY(numPartitionPagesLeft >= numPartitionPages)) { 325 if (LIKELY(numPartitionPagesLeft >= numPartitionPages)) {
334 // In this case, we can still hand out pages from the current super page 326 // In this case, we can still hand out pages from the current super page
335 // allocation. 327 // allocation.
336 char* ret = root->nextPartitionPage; 328 char* ret = root->nextPartitionPage;
337 root->nextPartitionPage += totalSize; 329 root->nextPartitionPage += totalSize;
338 return ret; 330 return ret;
339 } 331 }
340 332
341 // Need a new super page. 333 // Need a new super page.
342 root->totalSizeOfSuperPages += kSuperPageSize; 334 root->totalSizeOfSuperPages += kSuperPageSize;
343 if (root->totalSizeOfSuperPages > kMaxPartitionSize)
344 partitionFull();
345 char* requestedAddress = root->nextSuperPage; 335 char* requestedAddress = root->nextSuperPage;
346 char* superPage = reinterpret_cast<char*>(allocPages(requestedAddress, kSupe rPageSize, kSuperPageSize)); 336 char* superPage = reinterpret_cast<char*>(allocPages(requestedAddress, kSupe rPageSize, kSuperPageSize));
347 if (UNLIKELY(!superPage)) { 337 if (UNLIKELY(!superPage)) {
348 if (flags & PartitionAllocReturnNull) 338 if (flags & PartitionAllocReturnNull)
349 return 0; 339 return 0;
350 partitionOutOfMemory(); 340 partitionOutOfMemory();
351 } 341 }
352 root->nextSuperPage = superPage + kSuperPageSize; 342 root->nextSuperPage = superPage + kSuperPageSize;
353 char* ret = superPage + kPartitionPageSize; 343 char* ret = superPage + kPartitionPageSize;
354 root->nextPartitionPage = ret + totalSize; 344 root->nextPartitionPage = ret + totalSize;
(...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after
975 printf("total live: %zu bytes\n", totalLive); 965 printf("total live: %zu bytes\n", totalLive);
976 printf("total resident: %zu bytes\n", totalResident); 966 printf("total resident: %zu bytes\n", totalResident);
977 printf("total freeable: %zu bytes\n", totalFreeable); 967 printf("total freeable: %zu bytes\n", totalFreeable);
978 fflush(stdout); 968 fflush(stdout);
979 } 969 }
980 970
981 #endif // !NDEBUG 971 #endif // !NDEBUG
982 972
983 } // namespace WTF 973 } // namespace WTF
984 974
OLDNEW
« no previous file with comments | « Source/wtf/PartitionAlloc.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698