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

Side by Side Diff: src/heap/heap.cc

Issue 1034163002: Use atomic operation to read the length of a fixed array. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 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
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project 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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 3479 matching lines...) Expand 10 before | Expand all | Expand 10 after
3490 // for concurrent sweeping. The WasSwept predicate for concurrently swept 3490 // for concurrent sweeping. The WasSwept predicate for concurrently swept
3491 // pages is set after sweeping all pages. 3491 // pages is set after sweeping all pages.
3492 return (!is_in_old_pointer_space && !is_in_old_data_space) || 3492 return (!is_in_old_pointer_space && !is_in_old_data_space) ||
3493 page->WasSwept() || page->SweepingCompleted(); 3493 page->WasSwept() || page->SweepingCompleted();
3494 } 3494 }
3495 3495
3496 3496
3497 void Heap::AdjustLiveBytes(Address address, int by, InvocationMode mode) { 3497 void Heap::AdjustLiveBytes(Address address, int by, InvocationMode mode) {
3498 if (incremental_marking()->IsMarking() && 3498 if (incremental_marking()->IsMarking() &&
3499 Marking::IsBlack(Marking::MarkBitFrom(address))) { 3499 Marking::IsBlack(Marking::MarkBitFrom(address))) {
3500 if (mode == FROM_GC) { 3500 if (mode == SWEEPING_IS_OFF) {
3501 MemoryChunk::IncrementLiveBytesFromGC(address, by); 3501 MemoryChunk::IncrementLiveBytesFromGC(address, by);
3502 } else { 3502 } else {
3503 MemoryChunk::IncrementLiveBytesFromMutator(address, by); 3503 MemoryChunk::IncrementLiveBytesFromMutator(address, by);
3504 } 3504 }
3505 } 3505 }
3506 } 3506 }
3507 3507
3508 3508
3509 FixedArrayBase* Heap::LeftTrimFixedArray(FixedArrayBase* object, 3509 FixedArrayBase* Heap::LeftTrimFixedArray(FixedArrayBase* object,
3510 int elements_to_trim) { 3510 int elements_to_trim) {
(...skipping 28 matching lines...) Expand all
3539 DCHECK(CanMoveObjectStart(object)); 3539 DCHECK(CanMoveObjectStart(object));
3540 Object** former_start = HeapObject::RawField(object, 0); 3540 Object** former_start = HeapObject::RawField(object, 0);
3541 int new_start_index = elements_to_trim * (element_size / kPointerSize); 3541 int new_start_index = elements_to_trim * (element_size / kPointerSize);
3542 former_start[new_start_index] = map; 3542 former_start[new_start_index] = map;
3543 former_start[new_start_index + 1] = Smi::FromInt(len - elements_to_trim); 3543 former_start[new_start_index + 1] = Smi::FromInt(len - elements_to_trim);
3544 FixedArrayBase* new_object = 3544 FixedArrayBase* new_object =
3545 FixedArrayBase::cast(HeapObject::FromAddress(new_start)); 3545 FixedArrayBase::cast(HeapObject::FromAddress(new_start));
3546 3546
3547 // Maintain consistency of live bytes during incremental marking 3547 // Maintain consistency of live bytes during incremental marking
3548 marking()->TransferMark(object->address(), new_start); 3548 marking()->TransferMark(object->address(), new_start);
3549 AdjustLiveBytes(new_start, -bytes_to_trim, Heap::FROM_MUTATOR); 3549 AdjustLiveBytes(new_start, -bytes_to_trim, Heap::SWEEPING_STARTED);
3550 3550
3551 // Notify the heap profiler of change in object layout. 3551 // Notify the heap profiler of change in object layout.
3552 OnMoveEvent(new_object, object, new_object->Size()); 3552 OnMoveEvent(new_object, object, new_object->Size());
3553 return new_object; 3553 return new_object;
3554 } 3554 }
3555 3555
3556 3556
3557 // Force instantiation of templatized method. 3557 // Force instantiation of templatized method.
3558 template 3558 template void Heap::RightTrimFixedArray<Heap::SWEEPING_IS_OFF>(FixedArrayBase*,
3559 void Heap::RightTrimFixedArray<Heap::FROM_GC>(FixedArrayBase*, int); 3559 int);
3560 template 3560 template void Heap::RightTrimFixedArray<Heap::SWEEPING_STARTED>(FixedArrayBase*,
3561 void Heap::RightTrimFixedArray<Heap::FROM_MUTATOR>(FixedArrayBase*, int); 3561 int);
3562 3562
3563 3563
3564 template<Heap::InvocationMode mode> 3564 template<Heap::InvocationMode mode>
3565 void Heap::RightTrimFixedArray(FixedArrayBase* object, int elements_to_trim) { 3565 void Heap::RightTrimFixedArray(FixedArrayBase* object, int elements_to_trim) {
3566 const int element_size = object->IsFixedArray() ? kPointerSize : kDoubleSize; 3566 const int element_size = object->IsFixedArray() ? kPointerSize : kDoubleSize;
3567 const int bytes_to_trim = elements_to_trim * element_size; 3567 const int bytes_to_trim = elements_to_trim * element_size;
3568 3568
3569 // For now this trick is only applied to objects in new and paged space. 3569 // For now this trick is only applied to objects in new and paged space.
3570 DCHECK(object->map() != fixed_cow_array_map()); 3570 DCHECK(object->map() != fixed_cow_array_map());
3571 3571
(...skipping 2819 matching lines...) Expand 10 before | Expand all | Expand 10 after
6391 static_cast<int>(object_sizes_last_time_[index])); 6391 static_cast<int>(object_sizes_last_time_[index]));
6392 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) 6392 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT)
6393 #undef ADJUST_LAST_TIME_OBJECT_COUNT 6393 #undef ADJUST_LAST_TIME_OBJECT_COUNT
6394 6394
6395 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); 6395 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
6396 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); 6396 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_));
6397 ClearObjectStats(); 6397 ClearObjectStats();
6398 } 6398 }
6399 } 6399 }
6400 } // namespace v8::internal 6400 } // namespace v8::internal
OLDNEW
« src/heap/heap.h ('K') | « src/heap/heap.h ('k') | src/heap/mark-compact.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698