mirror of
https://github.com/classilla/tenfourfox.git
synced 2024-09-27 14:56:16 +00:00
112 lines
2.7 KiB
C++
112 lines
2.7 KiB
C++
|
/* -*- 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>;
|