OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 2507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2518 // You have to call this last, since the implementation from PagedSpace | 2518 // You have to call this last, since the implementation from PagedSpace |
2519 // doesn't know that memory was 'promised' to large object space. | 2519 // doesn't know that memory was 'promised' to large object space. |
2520 bool LargeObjectSpace::ReserveSpace(int bytes) { | 2520 bool LargeObjectSpace::ReserveSpace(int bytes) { |
2521 return heap()->OldGenerationCapacityAvailable() >= bytes && | 2521 return heap()->OldGenerationCapacityAvailable() >= bytes && |
2522 (!heap()->incremental_marking()->IsStopped() || | 2522 (!heap()->incremental_marking()->IsStopped() || |
2523 heap()->OldGenerationSpaceAvailable() >= bytes); | 2523 heap()->OldGenerationSpaceAvailable() >= bytes); |
2524 } | 2524 } |
2525 | 2525 |
2526 | 2526 |
2527 bool PagedSpace::AdvanceSweeper(intptr_t bytes_to_sweep) { | 2527 bool PagedSpace::AdvanceSweeper(intptr_t bytes_to_sweep) { |
2528 if (IsSweepingComplete()) return true; | 2528 if (IsLazySweepingComplete()) return true; |
2529 | 2529 |
2530 intptr_t freed_bytes = 0; | 2530 intptr_t freed_bytes = 0; |
2531 Page* p = first_unswept_page_; | 2531 Page* p = first_unswept_page_; |
2532 do { | 2532 do { |
2533 Page* next_page = p->next_page(); | 2533 Page* next_page = p->next_page(); |
2534 if (ShouldBeSweptLazily(p)) { | 2534 if (ShouldBeSweptLazily(p)) { |
2535 if (FLAG_gc_verbose) { | 2535 if (FLAG_gc_verbose) { |
2536 PrintF("Sweeping 0x%" V8PRIxPTR " lazily advanced.\n", | 2536 PrintF("Sweeping 0x%" V8PRIxPTR " lazily advanced.\n", |
2537 reinterpret_cast<intptr_t>(p)); | 2537 reinterpret_cast<intptr_t>(p)); |
2538 } | 2538 } |
2539 DecreaseUnsweptFreeBytes(p); | 2539 DecreaseUnsweptFreeBytes(p); |
2540 freed_bytes += | 2540 freed_bytes += |
2541 MarkCompactCollector:: | 2541 MarkCompactCollector:: |
2542 SweepConservatively<MarkCompactCollector::SWEEP_SEQUENTIALLY>( | 2542 SweepConservatively<MarkCompactCollector::SWEEP_SEQUENTIALLY>( |
2543 this, NULL, p); | 2543 this, NULL, p); |
2544 } | 2544 } |
2545 p = next_page; | 2545 p = next_page; |
2546 } while (p != anchor() && freed_bytes < bytes_to_sweep); | 2546 } while (p != anchor() && freed_bytes < bytes_to_sweep); |
2547 | 2547 |
2548 if (p == anchor()) { | 2548 if (p == anchor()) { |
2549 first_unswept_page_ = Page::FromAddress(NULL); | 2549 first_unswept_page_ = Page::FromAddress(NULL); |
2550 } else { | 2550 } else { |
2551 first_unswept_page_ = p; | 2551 first_unswept_page_ = p; |
2552 } | 2552 } |
2553 | 2553 |
2554 heap()->FreeQueuedChunks(); | 2554 heap()->FreeQueuedChunks(); |
2555 | 2555 |
2556 return IsSweepingComplete(); | 2556 return IsLazySweepingComplete(); |
2557 } | 2557 } |
2558 | 2558 |
2559 | 2559 |
2560 void PagedSpace::EvictEvacuationCandidatesFromFreeLists() { | 2560 void PagedSpace::EvictEvacuationCandidatesFromFreeLists() { |
2561 if (allocation_info_.top >= allocation_info_.limit) return; | 2561 if (allocation_info_.top >= allocation_info_.limit) return; |
2562 | 2562 |
2563 if (Page::FromAllocationTop(allocation_info_.top)->IsEvacuationCandidate()) { | 2563 if (Page::FromAllocationTop(allocation_info_.top)->IsEvacuationCandidate()) { |
2564 // Create filler object to keep page iterable if it was iterable. | 2564 // Create filler object to keep page iterable if it was iterable. |
2565 int remaining = | 2565 int remaining = |
2566 static_cast<int>(allocation_info_.limit - allocation_info_.top); | 2566 static_cast<int>(allocation_info_.limit - allocation_info_.top); |
2567 heap()->CreateFillerObjectAt(allocation_info_.top, remaining); | 2567 heap()->CreateFillerObjectAt(allocation_info_.top, remaining); |
2568 | 2568 |
2569 allocation_info_.top = NULL; | 2569 allocation_info_.top = NULL; |
2570 allocation_info_.limit = NULL; | 2570 allocation_info_.limit = NULL; |
2571 } | 2571 } |
2572 } | 2572 } |
2573 | 2573 |
2574 | 2574 |
2575 bool PagedSpace::EnsureSweeperProgress(intptr_t size_in_bytes) { | 2575 bool PagedSpace::EnsureSweeperProgress(intptr_t size_in_bytes) { |
2576 MarkCompactCollector* collector = heap()->mark_compact_collector(); | 2576 MarkCompactCollector* collector = heap()->mark_compact_collector(); |
2577 if (collector->AreSweeperThreadsActivated()) { | 2577 if (collector->AreSweeperThreadsActivated()) { |
2578 if (FLAG_concurrent_sweeping && | 2578 if (FLAG_concurrent_sweeping) { |
2579 collector->StealMemoryFromSweeperThreads(this) < size_in_bytes) { | 2579 if (collector->StealMemoryFromSweeperThreads(this) < size_in_bytes) { |
2580 collector->WaitUntilSweepingCompleted(); | 2580 collector->WaitUntilSweepingCompleted(); |
2581 return true; | 2581 return true; |
| 2582 } |
| 2583 return false; |
2582 } | 2584 } |
2583 return false; | 2585 return true; |
2584 } else { | 2586 } else { |
2585 return AdvanceSweeper(size_in_bytes); | 2587 return AdvanceSweeper(size_in_bytes); |
2586 } | 2588 } |
2587 } | 2589 } |
2588 | 2590 |
2589 | 2591 |
2590 HeapObject* PagedSpace::SlowAllocateRaw(int size_in_bytes) { | 2592 HeapObject* PagedSpace::SlowAllocateRaw(int size_in_bytes) { |
2591 // Allocation in this space has failed. | 2593 // Allocation in this space has failed. |
2592 | 2594 |
2593 // If there are unswept pages advance lazy sweeper a bounded number of times | 2595 // If there are unswept pages advance lazy sweeper a bounded number of times |
(...skipping 17 matching lines...) Expand all Loading... |
2611 return NULL; | 2613 return NULL; |
2612 } | 2614 } |
2613 | 2615 |
2614 // Try to expand the space and allocate in the new next page. | 2616 // Try to expand the space and allocate in the new next page. |
2615 if (Expand()) { | 2617 if (Expand()) { |
2616 return free_list_.Allocate(size_in_bytes); | 2618 return free_list_.Allocate(size_in_bytes); |
2617 } | 2619 } |
2618 | 2620 |
2619 // Last ditch, sweep all the remaining pages to try to find space. This may | 2621 // Last ditch, sweep all the remaining pages to try to find space. This may |
2620 // cause a pause. | 2622 // cause a pause. |
2621 if (!IsSweepingComplete()) { | 2623 if (!IsLazySweepingComplete()) { |
2622 EnsureSweeperProgress(kMaxInt); | 2624 EnsureSweeperProgress(kMaxInt); |
2623 | 2625 |
2624 // Retry the free list allocation. | 2626 // Retry the free list allocation. |
2625 HeapObject* object = free_list_.Allocate(size_in_bytes); | 2627 HeapObject* object = free_list_.Allocate(size_in_bytes); |
2626 if (object != NULL) return object; | 2628 if (object != NULL) return object; |
2627 } | 2629 } |
2628 | 2630 |
2629 // Finally, fail. | 2631 // Finally, fail. |
2630 return NULL; | 2632 return NULL; |
2631 } | 2633 } |
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3149 object->ShortPrint(); | 3151 object->ShortPrint(); |
3150 PrintF("\n"); | 3152 PrintF("\n"); |
3151 } | 3153 } |
3152 printf(" --------------------------------------\n"); | 3154 printf(" --------------------------------------\n"); |
3153 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); | 3155 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); |
3154 } | 3156 } |
3155 | 3157 |
3156 #endif // DEBUG | 3158 #endif // DEBUG |
3157 | 3159 |
3158 } } // namespace v8::internal | 3160 } } // namespace v8::internal |
OLD | NEW |