| 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 2704 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2715 } | 2715 } |
| 2716 | 2716 |
| 2717 ObjectSpace space = (executable == EXECUTABLE) | 2717 ObjectSpace space = (executable == EXECUTABLE) |
| 2718 ? kObjectSpaceCodeSpace | 2718 ? kObjectSpaceCodeSpace |
| 2719 : kObjectSpaceLoSpace; | 2719 : kObjectSpaceLoSpace; |
| 2720 isolate->memory_allocator()->PerformAllocationCallback( | 2720 isolate->memory_allocator()->PerformAllocationCallback( |
| 2721 space, kAllocationActionAllocate, size); | 2721 space, kAllocationActionAllocate, size); |
| 2722 | 2722 |
| 2723 LargeObjectChunk* chunk = reinterpret_cast<LargeObjectChunk*>(mem); | 2723 LargeObjectChunk* chunk = reinterpret_cast<LargeObjectChunk*>(mem); |
| 2724 chunk->size_ = size; | 2724 chunk->size_ = size; |
| 2725 Page* page = Page::FromAddress(RoundUp(chunk->address(), Page::kPageSize)); | 2725 chunk->GetPage()->heap_ = isolate->heap(); |
| 2726 page->heap_ = isolate->heap(); | |
| 2727 return chunk; | 2726 return chunk; |
| 2728 } | 2727 } |
| 2729 | 2728 |
| 2730 | 2729 |
| 2730 void LargeObjectChunk::Free(Executability executable) { |
| 2731 Isolate* isolate = GetPage()->heap_->isolate(); |
| 2732 isolate->memory_allocator()->FreeRawMemory(address(), size(), executable); |
| 2733 } |
| 2734 |
| 2735 |
| 2731 int LargeObjectChunk::ChunkSizeFor(int size_in_bytes) { | 2736 int LargeObjectChunk::ChunkSizeFor(int size_in_bytes) { |
| 2732 int os_alignment = static_cast<int>(OS::AllocateAlignment()); | 2737 int os_alignment = static_cast<int>(OS::AllocateAlignment()); |
| 2733 if (os_alignment < Page::kPageSize) { | 2738 if (os_alignment < Page::kPageSize) { |
| 2734 size_in_bytes += (Page::kPageSize - os_alignment); | 2739 size_in_bytes += (Page::kPageSize - os_alignment); |
| 2735 } | 2740 } |
| 2736 return size_in_bytes + Page::kObjectStartOffset; | 2741 return size_in_bytes + Page::kObjectStartOffset; |
| 2737 } | 2742 } |
| 2738 | 2743 |
| 2739 // ----------------------------------------------------------------------------- | 2744 // ----------------------------------------------------------------------------- |
| 2740 // LargeObjectSpace | 2745 // LargeObjectSpace |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2754 objects_size_ = 0; | 2759 objects_size_ = 0; |
| 2755 return true; | 2760 return true; |
| 2756 } | 2761 } |
| 2757 | 2762 |
| 2758 | 2763 |
| 2759 void LargeObjectSpace::TearDown() { | 2764 void LargeObjectSpace::TearDown() { |
| 2760 while (first_chunk_ != NULL) { | 2765 while (first_chunk_ != NULL) { |
| 2761 LargeObjectChunk* chunk = first_chunk_; | 2766 LargeObjectChunk* chunk = first_chunk_; |
| 2762 first_chunk_ = first_chunk_->next(); | 2767 first_chunk_ = first_chunk_->next(); |
| 2763 LOG(heap()->isolate(), DeleteEvent("LargeObjectChunk", chunk->address())); | 2768 LOG(heap()->isolate(), DeleteEvent("LargeObjectChunk", chunk->address())); |
| 2764 Page* page = Page::FromAddress(RoundUp(chunk->address(), Page::kPageSize)); | 2769 Executability executable = chunk->GetPage()->PageExecutability(); |
| 2765 Executability executable = page->PageExecutability(); | |
| 2766 ObjectSpace space = kObjectSpaceLoSpace; | 2770 ObjectSpace space = kObjectSpaceLoSpace; |
| 2767 if (executable == EXECUTABLE) space = kObjectSpaceCodeSpace; | 2771 if (executable == EXECUTABLE) space = kObjectSpaceCodeSpace; |
| 2768 size_t size = chunk->size(); | 2772 size_t size = chunk->size(); |
| 2769 size_t guard_size = (executable == EXECUTABLE) ? Page::kPageSize : 0; | 2773 size_t guard_size = (executable == EXECUTABLE) ? Page::kPageSize : 0; |
| 2770 heap()->isolate()->memory_allocator()->FreeRawMemory( | 2774 heap()->isolate()->memory_allocator()->FreeRawMemory( |
| 2771 chunk->address() - guard_size, | 2775 chunk->address() - guard_size, |
| 2772 size + guard_size, | 2776 size + guard_size, |
| 2773 executable); | 2777 executable); |
| 2774 heap()->isolate()->memory_allocator()->PerformAllocationCallback( | 2778 heap()->isolate()->memory_allocator()->PerformAllocationCallback( |
| 2775 space, kAllocationActionFree, size); | 2779 space, kAllocationActionFree, size); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2798 return Failure::RetryAfterGC(identity()); | 2802 return Failure::RetryAfterGC(identity()); |
| 2799 } | 2803 } |
| 2800 | 2804 |
| 2801 size_ += static_cast<int>(chunk->size()); | 2805 size_ += static_cast<int>(chunk->size()); |
| 2802 objects_size_ += requested_size; | 2806 objects_size_ += requested_size; |
| 2803 page_count_++; | 2807 page_count_++; |
| 2804 chunk->set_next(first_chunk_); | 2808 chunk->set_next(first_chunk_); |
| 2805 first_chunk_ = chunk; | 2809 first_chunk_ = chunk; |
| 2806 | 2810 |
| 2807 // Initialize page header. | 2811 // Initialize page header. |
| 2808 Page* page = Page::FromAddress(RoundUp(chunk->address(), Page::kPageSize)); | 2812 Page* page = chunk->GetPage(); |
| 2809 Address object_address = page->ObjectAreaStart(); | 2813 Address object_address = page->ObjectAreaStart(); |
| 2810 | 2814 |
| 2811 // Clear the low order bit of the second word in the page to flag it as a | 2815 // Clear the low order bit of the second word in the page to flag it as a |
| 2812 // large object page. If the chunk_size happened to be written there, its | 2816 // large object page. If the chunk_size happened to be written there, its |
| 2813 // low order bit should already be clear. | 2817 // low order bit should already be clear. |
| 2814 page->SetIsLargeObjectPage(true); | 2818 page->SetIsLargeObjectPage(true); |
| 2815 page->SetPageExecutability(executable); | 2819 page->SetPageExecutability(executable); |
| 2816 page->SetRegionMarks(Page::kAllRegionsCleanMarks); | 2820 page->SetRegionMarks(Page::kAllRegionsCleanMarks); |
| 2817 return HeapObject::FromAddress(object_address); | 2821 return HeapObject::FromAddress(object_address); |
| 2818 } | 2822 } |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2936 LargeObjectChunk* previous = NULL; | 2940 LargeObjectChunk* previous = NULL; |
| 2937 LargeObjectChunk* current = first_chunk_; | 2941 LargeObjectChunk* current = first_chunk_; |
| 2938 while (current != NULL) { | 2942 while (current != NULL) { |
| 2939 HeapObject* object = current->GetObject(); | 2943 HeapObject* object = current->GetObject(); |
| 2940 if (object->IsMarked()) { | 2944 if (object->IsMarked()) { |
| 2941 object->ClearMark(); | 2945 object->ClearMark(); |
| 2942 heap()->mark_compact_collector()->tracer()->decrement_marked_count(); | 2946 heap()->mark_compact_collector()->tracer()->decrement_marked_count(); |
| 2943 previous = current; | 2947 previous = current; |
| 2944 current = current->next(); | 2948 current = current->next(); |
| 2945 } else { | 2949 } else { |
| 2946 Page* page = Page::FromAddress(RoundUp(current->address(), | 2950 Executability executable = current->GetPage()->PageExecutability(); |
| 2947 Page::kPageSize)); | |
| 2948 Executability executable = page->PageExecutability(); | |
| 2949 Address chunk_address = current->address(); | 2951 Address chunk_address = current->address(); |
| 2950 size_t chunk_size = current->size(); | 2952 size_t chunk_size = current->size(); |
| 2951 | 2953 |
| 2952 // Cut the chunk out from the chunk list. | 2954 // Cut the chunk out from the chunk list. |
| 2953 current = current->next(); | 2955 current = current->next(); |
| 2954 if (previous == NULL) { | 2956 if (previous == NULL) { |
| 2955 first_chunk_ = current; | 2957 first_chunk_ = current; |
| 2956 } else { | 2958 } else { |
| 2957 previous->set_next(current); | 2959 previous->set_next(current); |
| 2958 } | 2960 } |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3087 for (HeapObject* obj = obj_it.next(); obj != NULL; obj = obj_it.next()) { | 3089 for (HeapObject* obj = obj_it.next(); obj != NULL; obj = obj_it.next()) { |
| 3088 if (obj->IsCode()) { | 3090 if (obj->IsCode()) { |
| 3089 Code* code = Code::cast(obj); | 3091 Code* code = Code::cast(obj); |
| 3090 isolate->code_kind_statistics()[code->kind()] += code->Size(); | 3092 isolate->code_kind_statistics()[code->kind()] += code->Size(); |
| 3091 } | 3093 } |
| 3092 } | 3094 } |
| 3093 } | 3095 } |
| 3094 #endif // DEBUG | 3096 #endif // DEBUG |
| 3095 | 3097 |
| 3096 } } // namespace v8::internal | 3098 } } // namespace v8::internal |
| OLD | NEW |