blob: 580ae94721d7e405197014cf14dc56bbfb186ca7 [file] [log] [blame]
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: set ts=8 sts=4 et sw=4 tw=99:
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "gc/StoreBuffer.h"
#include "mozilla/Assertions.h"
#include "jscompartment.h"
#include "gc/Statistics.h"
#include "vm/ArgumentsObject.h"
#include "vm/Runtime.h"
#include "jsgcinlines.h"
using namespace js;
using namespace js::gc;
void
StoreBuffer::GenericBuffer::trace(StoreBuffer* owner, JSTracer* trc)
{
mozilla::ReentrancyGuard g(*owner);
MOZ_ASSERT(owner->isEnabled());
if (!storage_)
return;
for (LifoAlloc::Enum e(*storage_); !e.empty();) {
unsigned size = *e.get<unsigned>();
e.popFront<unsigned>();
BufferableRef* edge = e.get<BufferableRef>(size);
edge->trace(trc);
e.popFront(size);
}
}
bool
StoreBuffer::enable()
{
if (enabled_)
return true;
if (!bufferVal.init() ||
!bufferCell.init() ||
!bufferSlot.init() ||
!bufferWholeCell.init() ||
!bufferGeneric.init())
{
return false;
}
enabled_ = true;
return true;
}
void
StoreBuffer::disable()
{
if (!enabled_)
return;
aboutToOverflow_ = false;
enabled_ = false;
}
bool
StoreBuffer::clear()
{
if (!enabled_)
return true;
aboutToOverflow_ = false;
cancelIonCompilations_ = false;
bufferVal.clear();
bufferCell.clear();
bufferSlot.clear();
bufferWholeCell.clear();
bufferGeneric.clear();
return true;
}
void
StoreBuffer::setAboutToOverflow()
{
if (!aboutToOverflow_) {
aboutToOverflow_ = true;
runtime_->gc.stats.count(gcstats::STAT_STOREBUFFER_OVERFLOW);
}
runtime_->gc.requestMinorGC(JS::gcreason::FULL_STORE_BUFFER);
}
void
StoreBuffer::addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::GCSizes
*sizes)
{
sizes->storeBufferVals += bufferVal.sizeOfExcludingThis(mallocSizeOf);
sizes->storeBufferCells += bufferCell.sizeOfExcludingThis(mallocSizeOf);
sizes->storeBufferSlots += bufferSlot.sizeOfExcludingThis(mallocSizeOf);
sizes->storeBufferWholeCells += bufferWholeCell.sizeOfExcludingThis(mallocSizeOf);
sizes->storeBufferGenerics += bufferGeneric.sizeOfExcludingThis(mallocSizeOf);
}
template struct StoreBuffer::MonoTypeBuffer<StoreBuffer::ValueEdge>;
template struct StoreBuffer::MonoTypeBuffer<StoreBuffer::CellPtrEdge>;
template struct StoreBuffer::MonoTypeBuffer<StoreBuffer::SlotsEdge>;
template struct StoreBuffer::MonoTypeBuffer<StoreBuffer::WholeCellEdges>;