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