mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 03:45:46 +00:00
Bug 1263772 - Use WeakCache wrapper to sweep BaseShape table; r=jonco
--HG-- extra : rebase_source : a698230ef1f38bfd549417ed2256603ab94bd49e
This commit is contained in:
parent
a00f81eba6
commit
321ad1873e
@ -136,13 +136,13 @@ class GCHashMapOperations
|
||||
using Map = GCHashMap<Args...>;
|
||||
using Lookup = typename Map::Lookup;
|
||||
using Ptr = typename Map::Ptr;
|
||||
using AddPtr = typename Map::AddPtr;
|
||||
using Range = typename Map::Range;
|
||||
using Enum = typename Map::Enum;
|
||||
|
||||
const Map& map() const { return static_cast<const Outer*>(this)->get(); }
|
||||
|
||||
public:
|
||||
using AddPtr = typename Map::AddPtr;
|
||||
|
||||
bool initialized() const { return map().initialized(); }
|
||||
Ptr lookup(const Lookup& l) const { return map().lookup(l); }
|
||||
AddPtr lookupForAdd(const Lookup& l) const { return map().lookupForAdd(l); }
|
||||
@ -151,6 +151,12 @@ class GCHashMapOperations
|
||||
uint32_t count() const { return map().count(); }
|
||||
size_t capacity() const { return map().capacity(); }
|
||||
bool has(const Lookup& l) const { return map().lookup(l).found(); }
|
||||
size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
|
||||
return map().sizeOfExcludingThis(mallocSizeOf);
|
||||
}
|
||||
size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
|
||||
return mallocSizeOf(this) + map().sizeOfExcludingThis(mallocSizeOf);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Outer, typename... Args>
|
||||
@ -160,13 +166,14 @@ class MutableGCHashMapOperations
|
||||
using Map = GCHashMap<Args...>;
|
||||
using Lookup = typename Map::Lookup;
|
||||
using Ptr = typename Map::Ptr;
|
||||
using AddPtr = typename Map::AddPtr;
|
||||
using Range = typename Map::Range;
|
||||
using Enum = typename Map::Enum;
|
||||
|
||||
Map& map() { return static_cast<Outer*>(this)->get(); }
|
||||
|
||||
public:
|
||||
using AddPtr = typename Map::AddPtr;
|
||||
struct Enum : public Map::Enum { explicit Enum(Outer& o) : Map::Enum(o.map()) {} };
|
||||
|
||||
bool init(uint32_t len = 16) { return map().init(len); }
|
||||
void clear() { map().clear(); }
|
||||
void finish() { map().finish(); }
|
||||
@ -279,13 +286,14 @@ class GCHashSetOperations
|
||||
using Set = GCHashSet<Args...>;
|
||||
using Lookup = typename Set::Lookup;
|
||||
using Ptr = typename Set::Ptr;
|
||||
using AddPtr = typename Set::AddPtr;
|
||||
using Range = typename Set::Range;
|
||||
using Enum = typename Set::Enum;
|
||||
|
||||
const Set& set() const { return static_cast<const Outer*>(this)->get(); }
|
||||
|
||||
public:
|
||||
using AddPtr = typename Set::AddPtr;
|
||||
using Entry = typename Set::Entry;
|
||||
|
||||
bool initialized() const { return set().initialized(); }
|
||||
Ptr lookup(const Lookup& l) const { return set().lookup(l); }
|
||||
AddPtr lookupForAdd(const Lookup& l) const { return set().lookupForAdd(l); }
|
||||
@ -294,6 +302,12 @@ class GCHashSetOperations
|
||||
uint32_t count() const { return set().count(); }
|
||||
size_t capacity() const { return set().capacity(); }
|
||||
bool has(const Lookup& l) const { return set().lookup(l).found(); }
|
||||
size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
|
||||
return set().sizeOfExcludingThis(mallocSizeOf);
|
||||
}
|
||||
size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
|
||||
return mallocSizeOf(this) + set().sizeOfExcludingThis(mallocSizeOf);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Outer, typename... Args>
|
||||
@ -303,13 +317,15 @@ class MutableGCHashSetOperations
|
||||
using Set = GCHashSet<Args...>;
|
||||
using Lookup = typename Set::Lookup;
|
||||
using Ptr = typename Set::Ptr;
|
||||
using AddPtr = typename Set::AddPtr;
|
||||
using Range = typename Set::Range;
|
||||
using Enum = typename Set::Enum;
|
||||
|
||||
Set& set() { return static_cast<Outer*>(this)->get(); }
|
||||
|
||||
public:
|
||||
using AddPtr = typename Set::AddPtr;
|
||||
using Entry = typename Set::Entry;
|
||||
struct Enum : public Set::Enum { explicit Enum(Outer& o) : Set::Enum(o.set()) {} };
|
||||
|
||||
bool init(uint32_t len = 16) { return set().init(len); }
|
||||
void clear() { set().clear(); }
|
||||
void finish() { set().finish(); }
|
||||
|
@ -66,6 +66,7 @@ JSCompartment::JSCompartment(Zone* zone, const JS::CompartmentOptions& options =
|
||||
detachedTypedObjects(0),
|
||||
objectMetadataState(ImmediateMetadata()),
|
||||
propertyTree(thisForCtor()),
|
||||
baseShapes(zone, BaseShapeSet()),
|
||||
selfHostingScriptSource(nullptr),
|
||||
objectMetadataTable(nullptr),
|
||||
innerViews(zone, InnerViewTable()),
|
||||
|
@ -438,8 +438,7 @@ struct JSCompartment
|
||||
js::PropertyTree propertyTree;
|
||||
|
||||
/* Set of all unowned base shapes in the compartment. */
|
||||
js::BaseShapeSet baseShapes;
|
||||
void sweepBaseShapeTable();
|
||||
JS::WeakCache<js::BaseShapeSet> baseShapes;
|
||||
|
||||
/* Set of initial shapes in the compartment. */
|
||||
js::InitialShapeSet initialShapes;
|
||||
|
@ -2452,7 +2452,6 @@ GCRuntime::sweepZoneAfterCompacting(Zone* zone)
|
||||
cache->sweep();
|
||||
|
||||
for (CompartmentsInZoneIter c(zone); !c.done(); c.next()) {
|
||||
c->sweepBaseShapeTable();
|
||||
c->sweepInitialShapeTable();
|
||||
c->objectGroups.sweep(fop);
|
||||
c->sweepRegExps();
|
||||
@ -5083,13 +5082,6 @@ SweepCCWrappersTask::run()
|
||||
c->sweepCrossCompartmentWrappers();
|
||||
}
|
||||
|
||||
/* virtual */ void
|
||||
SweepBaseShapesTask::run()
|
||||
{
|
||||
for (GCCompartmentGroupIter c(runtime); !c.done(); c.next())
|
||||
c->sweepBaseShapeTable();
|
||||
}
|
||||
|
||||
/* virtual */ void
|
||||
SweepInitialShapesTask::run()
|
||||
{
|
||||
@ -5172,7 +5164,6 @@ GCRuntime::beginSweepingZoneGroup()
|
||||
FreeOp fop(rt);
|
||||
SweepAtomsTask sweepAtomsTask(rt);
|
||||
SweepCCWrappersTask sweepCCWrappersTask(rt);
|
||||
SweepBaseShapesTask sweepBaseShapesTask(rt);
|
||||
SweepInitialShapesTask sweepInitialShapesTask(rt);
|
||||
SweepObjectGroupsTask sweepObjectGroupsTask(rt);
|
||||
SweepRegExpsTask sweepRegExpsTask(rt);
|
||||
@ -5227,7 +5218,6 @@ GCRuntime::beginSweepingZoneGroup()
|
||||
{
|
||||
AutoLockHelperThreadState helperLock;
|
||||
startTask(sweepCCWrappersTask, gcstats::PHASE_SWEEP_CC_WRAPPER);
|
||||
startTask(sweepBaseShapesTask, gcstats::PHASE_SWEEP_BASE_SHAPE);
|
||||
startTask(sweepInitialShapesTask, gcstats::PHASE_SWEEP_INITIAL_SHAPE);
|
||||
startTask(sweepObjectGroupsTask, gcstats::PHASE_SWEEP_TYPE_OBJECT);
|
||||
startTask(sweepRegExpsTask, gcstats::PHASE_SWEEP_REGEXP);
|
||||
@ -5309,7 +5299,6 @@ GCRuntime::beginSweepingZoneGroup()
|
||||
|
||||
AutoLockHelperThreadState helperLock;
|
||||
joinTask(sweepCCWrappersTask, gcstats::PHASE_SWEEP_CC_WRAPPER);
|
||||
joinTask(sweepBaseShapesTask, gcstats::PHASE_SWEEP_BASE_SHAPE);
|
||||
joinTask(sweepInitialShapesTask, gcstats::PHASE_SWEEP_INITIAL_SHAPE);
|
||||
joinTask(sweepObjectGroupsTask, gcstats::PHASE_SWEEP_TYPE_OBJECT);
|
||||
joinTask(sweepRegExpsTask, gcstats::PHASE_SWEEP_REGEXP);
|
||||
|
@ -30,6 +30,11 @@ struct DependentAddPtr
|
||||
, originalGcNumber(cx->zone()->gcNumber())
|
||||
{}
|
||||
|
||||
DependentAddPtr(DependentAddPtr&& other)
|
||||
: addPtr(other.addPtr)
|
||||
, originalGcNumber(other.originalGcNumber)
|
||||
{}
|
||||
|
||||
template <class KeyInput, class ValueInput>
|
||||
bool add(ExclusiveContext* cx, T& table, const KeyInput& key, const ValueInput& value) {
|
||||
bool gcHappened = originalGcNumber != cx->zone()->gcNumber();
|
||||
@ -42,7 +47,6 @@ struct DependentAddPtr
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool found() const { return addPtr.found(); }
|
||||
explicit operator bool() const { return found(); }
|
||||
const Entry& operator*() const { return *addPtr; }
|
||||
@ -57,6 +61,15 @@ struct DependentAddPtr
|
||||
DependentAddPtr& operator=(const DependentAddPtr&) = delete;
|
||||
};
|
||||
|
||||
template <typename T, typename Lookup>
|
||||
inline auto
|
||||
MakeDependentAddPtr(const ExclusiveContext* cx, T& table, const Lookup& lookup)
|
||||
-> DependentAddPtr<typename mozilla::RemoveReference<decltype(table)>::Type>
|
||||
{
|
||||
using Ptr = DependentAddPtr<typename mozilla::RemoveReference<decltype(table)>::Type>;
|
||||
return Ptr(cx, table, lookup);
|
||||
}
|
||||
|
||||
} // namespace js
|
||||
|
||||
#endif
|
||||
|
@ -1293,14 +1293,14 @@ BaseShape::adoptUnowned(UnownedBaseShape* other)
|
||||
/* static */ UnownedBaseShape*
|
||||
BaseShape::getUnowned(ExclusiveContext* cx, StackBaseShape& base)
|
||||
{
|
||||
BaseShapeSet& table = cx->compartment()->baseShapes;
|
||||
auto& table = cx->compartment()->baseShapes;
|
||||
|
||||
if (!table.initialized() && !table.init()) {
|
||||
ReportOutOfMemory(cx);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DependentAddPtr<BaseShapeSet> p(cx, table, base);
|
||||
auto p = MakeDependentAddPtr(cx, table, base);
|
||||
if (p)
|
||||
return *p;
|
||||
|
||||
@ -1359,12 +1359,6 @@ BaseShape::traceShapeTable(JSTracer* trc)
|
||||
table().trace(trc);
|
||||
}
|
||||
|
||||
void
|
||||
JSCompartment::sweepBaseShapeTable()
|
||||
{
|
||||
baseShapes.sweep();
|
||||
}
|
||||
|
||||
#ifdef JSGC_HASH_TABLE_CHECKS
|
||||
|
||||
void
|
||||
@ -1373,7 +1367,7 @@ JSCompartment::checkBaseShapeTableAfterMovingGC()
|
||||
if (!baseShapes.initialized())
|
||||
return;
|
||||
|
||||
for (BaseShapeSet::Enum e(baseShapes); !e.empty(); e.popFront()) {
|
||||
for (decltype(baseShapes)::Enum e(baseShapes); !e.empty(); e.popFront()) {
|
||||
UnownedBaseShape* base = e.front().unbarrieredGet();
|
||||
CheckGCThingAfterMovingGC(base);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user