OLD | NEW |
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 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 normal_page->Unlink(&first_unswept_page_); | 497 normal_page->Unlink(&first_unswept_page_); |
498 normal_page->MarkAsSwept(); | 498 normal_page->MarkAsSwept(); |
499 // If not the first page, add |normalPage| onto the available pages chain. | 499 // If not the first page, add |normalPage| onto the available pages chain. |
500 if (!context.current_page_) | 500 if (!context.current_page_) |
501 context.current_page_ = normal_page; | 501 context.current_page_ = normal_page; |
502 else | 502 else |
503 normal_page->Link(&context.available_pages_); | 503 normal_page->Link(&context.available_pages_); |
504 normal_page->SweepAndCompact(context); | 504 normal_page->SweepAndCompact(context); |
505 } | 505 } |
506 | 506 |
| 507 // All pages were empty; nothing to compact. |
| 508 if (!context.current_page_) { |
| 509 heap.Compaction()->FinishedArenaCompaction(this, 0, 0); |
| 510 return; |
| 511 } |
| 512 |
507 size_t freed_size = 0; | 513 size_t freed_size = 0; |
508 size_t freed_page_count = 0; | 514 size_t freed_page_count = 0; |
509 | 515 |
510 DCHECK(context.current_page_); | |
511 // If the current page hasn't been allocated into, add it to the available | 516 // If the current page hasn't been allocated into, add it to the available |
512 // list, for subsequent release below. | 517 // list, for subsequent release below. |
513 size_t allocation_point = context.allocation_point_; | 518 size_t allocation_point = context.allocation_point_; |
514 if (!allocation_point) { | 519 if (!allocation_point) { |
515 context.current_page_->Link(&context.available_pages_); | 520 context.current_page_->Link(&context.available_pages_); |
516 } else { | 521 } else { |
517 NormalPage* current_page = context.current_page_; | 522 NormalPage* current_page = context.current_page_; |
518 current_page->Link(&first_page_); | 523 current_page->Link(&first_page_); |
519 if (allocation_point != current_page->PayloadSize()) { | 524 if (allocation_point != current_page->PayloadSize()) { |
520 // Put the remainder of the page onto the free list. | 525 // Put the remainder of the page onto the free list. |
(...skipping 1318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1839 | 1844 |
1840 has_entries_ = true; | 1845 has_entries_ = true; |
1841 size_t index = GetHash(address); | 1846 size_t index = GetHash(address); |
1842 DCHECK(!(index & 1)); | 1847 DCHECK(!(index & 1)); |
1843 Address cache_page = RoundToBlinkPageStart(address); | 1848 Address cache_page = RoundToBlinkPageStart(address); |
1844 entries_[index + 1] = entries_[index]; | 1849 entries_[index + 1] = entries_[index]; |
1845 entries_[index] = cache_page; | 1850 entries_[index] = cache_page; |
1846 } | 1851 } |
1847 | 1852 |
1848 } // namespace blink | 1853 } // namespace blink |
OLD | NEW |