13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 23ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Redistribution and use in source and binary forms, with or without 33ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// modification, are permitted provided that the following conditions are 43ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// met: 53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * Redistributions of source code must retain the above copyright 73ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// notice, this list of conditions and the following disclaimer. 83ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * Redistributions in binary form must reproduce the above 93ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// copyright notice, this list of conditions and the following 103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// disclaimer in the documentation and/or other materials provided 113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// with the distribution. 123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * Neither the name of Google Inc. nor the names of its 133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// contributors may be used to endorse or promote products derived 143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// from this software without specific prior written permission. 153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifndef V8_MARK_COMPACT_INL_H_ 293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define V8_MARK_COMPACT_INL_H_ 303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "isolate.h" 323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "memory.h" 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "mark-compact.h" 343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace v8 { 373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace internal { 383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 403ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMarkBit Marking::MarkBitFrom(Address addr) { 413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MemoryChunk* p = MemoryChunk::FromAddress(addr); 423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return p->markbits()->MarkBitFromIndex(p->AddressToMarkbitIndex(addr), 433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch p->ContainsOnlyData()); 443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid MarkCompactCollector::SetFlags(int flags) { 483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch sweep_precisely_ = ((flags & Heap::kSweepPreciselyMask) != 0); 493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reduce_memory_footprint_ = ((flags & Heap::kReduceMemoryFootprintMask) != 0); 503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch abort_incremental_marking_ = 513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ((flags & Heap::kAbortIncrementalMarkingMask) != 0); 523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid MarkCompactCollector::MarkObject(HeapObject* obj, MarkBit mark_bit) { 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(Marking::MarkBitFrom(obj) == mark_bit); 573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!mark_bit.Get()) { 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch mark_bit.Set(); 593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size()); 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ProcessNewlyMarkedObject(obj); 613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool MarkCompactCollector::MarkObjectWithoutPush(HeapObject* object) { 663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MarkBit mark = Marking::MarkBitFrom(object); 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool old_mark = mark.Get(); 683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!old_mark) SetMark(object, mark); 693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return old_mark; 703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid MarkCompactCollector::MarkObjectAndPush(HeapObject* object) { 743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!MarkObjectWithoutPush(object)) marking_deque_.PushBlack(object); 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid MarkCompactCollector::SetMark(HeapObject* obj, MarkBit mark_bit) { 793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(!mark_bit.Get()); 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(Marking::MarkBitFrom(obj) == mark_bit); 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch mark_bit.Set(); 823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size()); 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (obj->IsMap()) { 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap_->ClearCacheOnMap(Map::cast(obj)); 853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool MarkCompactCollector::IsMarked(Object* obj) { 903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(obj->IsHeapObject()); 913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HeapObject* heap_object = HeapObject::cast(obj); 923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Marking::MarkBitFrom(heap_object).Get(); 933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid MarkCompactCollector::RecordSlot(Object** anchor_slot, 973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object** slot, 983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* object) { 993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Page* object_page = Page::FromAddress(reinterpret_cast<Address>(object)); 1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (object_page->IsEvacuationCandidate() && 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !ShouldSkipEvacuationSlotRecording(anchor_slot)) { 1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!SlotsBuffer::AddTo(&slots_buffer_allocator_, 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object_page->slots_buffer_address(), 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch slot, 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SlotsBuffer::FAIL_ON_OVERFLOW)) { 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch EvictEvacuationCandidate(object_page); 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} } // namespace v8::internal 1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif // V8_MARK_COMPACT_INL_H_ 115