Bug 1263772 - Use WeakCache wrapper to sweep BaseShape table; r=jonco

--HG--
extra : rebase_source : a698230ef1f38bfd549417ed2256603ab94bd49e
This commit is contained in:
Terrence Cole 2016-04-12 17:05:15 -07:00
parent a00f81eba6
commit 321ad1873e
6 changed files with 43 additions and 31 deletions

View File

@ -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(); }

View File

@ -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()),

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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);