author | Jon Coppeard <jcoppeard@mozilla.com> |
Thu, 23 Feb 2017 16:26:14 +0000 | |
changeset 344609 | 8b4e84832765f2334567865541c4fd842b63d8c0 |
parent 344608 | e0709404b9ae55fa53325afcbc4d3bfc0802fe29 |
child 344610 | f8c367bec5de25a16bd17a29bbd68ceafa3b0935 |
push id | 31414 |
push user | cbook@mozilla.com |
push date | Fri, 24 Feb 2017 10:47:41 +0000 |
treeherder | mozilla-central@be661bae6cb9 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | sfink |
bugs | 1340597 |
milestone | 54.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/js/src/gc/Iteration.cpp +++ b/js/src/gc/Iteration.cpp @@ -15,65 +15,65 @@ #include "jscntxtinlines.h" #include "jsgcinlines.h" using namespace js; using namespace js::gc; static void -IterateCompartmentsArenasCells(JSContext* cx, Zone* zone, void* data, - JSIterateCompartmentCallback compartmentCallback, - IterateArenaCallback arenaCallback, - IterateCellCallback cellCallback) +IterateCompartmentsArenasCellsUnbarriered(JSContext* cx, Zone* zone, void* data, + JSIterateCompartmentCallback compartmentCallback, + IterateArenaCallback arenaCallback, + IterateCellCallback cellCallback) { for (CompartmentsInZoneIter comp(zone); !comp.done(); comp.next()) (*compartmentCallback)(cx, data, comp); for (auto thingKind : AllAllocKinds()) { JS::TraceKind traceKind = MapAllocToTraceKind(thingKind); size_t thingSize = Arena::thingSize(thingKind); for (ArenaIter aiter(zone, thingKind); !aiter.done(); aiter.next()) { Arena* arena = aiter.get(); (*arenaCallback)(cx->runtime(), data, arena, traceKind, thingSize); - for (ArenaCellIter iter(arena); !iter.done(); iter.next()) + for (ArenaCellIterUnbarriered iter(arena); !iter.done(); iter.next()) (*cellCallback)(cx->runtime(), data, iter.getCell(), traceKind, thingSize); } } } void -js::IterateZonesCompartmentsArenasCells(JSContext* cx, void* data, - IterateZoneCallback zoneCallback, - JSIterateCompartmentCallback compartmentCallback, - IterateArenaCallback arenaCallback, - IterateCellCallback cellCallback) +js::IterateHeapUnbarriered(JSContext* cx, void* data, + IterateZoneCallback zoneCallback, + JSIterateCompartmentCallback compartmentCallback, + IterateArenaCallback arenaCallback, + IterateCellCallback cellCallback) { AutoPrepareForTracing prop(cx, WithAtoms); for (ZonesIter zone(cx->runtime(), WithAtoms); !zone.done(); zone.next()) { (*zoneCallback)(cx->runtime(), data, zone); - IterateCompartmentsArenasCells(cx, zone, data, - compartmentCallback, arenaCallback, cellCallback); + IterateCompartmentsArenasCellsUnbarriered(cx, zone, data, + compartmentCallback, arenaCallback, cellCallback); } } void -js::IterateZoneCompartmentsArenasCells(JSContext* cx, Zone* zone, void* data, - IterateZoneCallback zoneCallback, - JSIterateCompartmentCallback compartmentCallback, - IterateArenaCallback arenaCallback, - IterateCellCallback cellCallback) +js::IterateHeapUnbarrieredForZone(JSContext* cx, Zone* zone, void* data, + IterateZoneCallback zoneCallback, + JSIterateCompartmentCallback compartmentCallback, + IterateArenaCallback arenaCallback, + IterateCellCallback cellCallback) { AutoPrepareForTracing prop(cx, WithAtoms); (*zoneCallback)(cx->runtime(), data, zone); - IterateCompartmentsArenasCells(cx, zone, data, - compartmentCallback, arenaCallback, cellCallback); + IterateCompartmentsArenasCellsUnbarriered(cx, zone, data, + compartmentCallback, arenaCallback, cellCallback); } void js::IterateChunks(JSContext* cx, void* data, IterateChunkCallback chunkCallback) { AutoPrepareForTracing prep(cx, SkipAtoms); for (auto chunk = cx->runtime()->gc.allNonEmptyChunks(); !chunk.done(); chunk.next())
--- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -1179,21 +1179,21 @@ js::DumpHeap(JSContext* cx, FILE* fp, js } fprintf(dtrc.output, "# Weak maps.\n"); WeakMapBase::traceAllMappings(&dtrc); fprintf(dtrc.output, "==========\n"); dtrc.prefix = "> "; - IterateZonesCompartmentsArenasCells(cx, &dtrc, - DumpHeapVisitZone, - DumpHeapVisitCompartment, - DumpHeapVisitArena, - DumpHeapVisitCell); + IterateHeapUnbarriered(cx, &dtrc, + DumpHeapVisitZone, + DumpHeapVisitCompartment, + DumpHeapVisitArena, + DumpHeapVisitCell); fflush(dtrc.output); } JS_FRIEND_API(void) js::SetActivityCallback(JSContext* cx, ActivityCallback cb, void* arg) { cx->activityCallback = cb;
--- a/js/src/jsgc.h +++ b/js/src/jsgc.h @@ -1013,34 +1013,37 @@ typedef void (*IterateArenaCallback)(JSR JS::TraceKind traceKind, size_t thingSize); typedef void (*IterateCellCallback)(JSRuntime* rt, void* data, void* thing, JS::TraceKind traceKind, size_t thingSize); /* * This function calls |zoneCallback| on every zone, |compartmentCallback| on * every compartment, |arenaCallback| on every in-use arena, and |cellCallback| * on every in-use cell in the GC heap. + * + * Note that no read barrier is triggered on the cells passed to cellCallback, + * so no these pointers must not escape the callback. */ extern void -IterateZonesCompartmentsArenasCells(JSContext* cx, void* data, - IterateZoneCallback zoneCallback, - JSIterateCompartmentCallback compartmentCallback, - IterateArenaCallback arenaCallback, - IterateCellCallback cellCallback); +IterateHeapUnbarriered(JSContext* cx, void* data, + IterateZoneCallback zoneCallback, + JSIterateCompartmentCallback compartmentCallback, + IterateArenaCallback arenaCallback, + IterateCellCallback cellCallback); /* * This function is like IterateZonesCompartmentsArenasCells, but does it for a * single zone. */ extern void -IterateZoneCompartmentsArenasCells(JSContext* cx, Zone* zone, void* data, - IterateZoneCallback zoneCallback, - JSIterateCompartmentCallback compartmentCallback, - IterateArenaCallback arenaCallback, - IterateCellCallback cellCallback); +IterateHeapUnbarrieredForZone(JSContext* cx, Zone* zone, void* data, + IterateZoneCallback zoneCallback, + JSIterateCompartmentCallback compartmentCallback, + IterateArenaCallback arenaCallback, + IterateCellCallback cellCallback); /* * Invoke chunkCallback on every in-use chunk. */ extern void IterateChunks(JSContext* cx, void* data, IterateChunkCallback chunkCallback); typedef void (*IterateScriptCallback)(JSRuntime* rt, void* data, JSScript* script);
--- a/js/src/jsgcinlines.h +++ b/js/src/jsgcinlines.h @@ -149,18 +149,16 @@ class ArenaCellIterImpl : initialized(false) { init(arena, mayNeedBarrier); } void init(Arena* arena, CellIterNeedsBarrier mayNeedBarrier) { MOZ_ASSERT(!initialized); MOZ_ASSERT(arena); - MOZ_ASSERT_IF(!mayNeedBarrier, - CurrentThreadIsPerformingGC() || CurrentThreadIsGCSweeping()); initialized = true; AllocKind kind = arena->getAllocKind(); firstThingOffset = Arena::firstThingOffset(kind); thingSize = Arena::thingSize(kind); traceKind = MapAllocToTraceKind(kind); needsBarrier = mayNeedBarrier && !JS::CurrentThreadIsHeapCollecting(); reset(arena); } @@ -238,16 +236,24 @@ class ArenaCellIterUnderFinalize : publi public: explicit ArenaCellIterUnderFinalize(Arena* arena) : ArenaCellIterImpl(arena, CellIterDoesntNeedBarrier) { MOZ_ASSERT(CurrentThreadIsGCSweeping()); } }; +class ArenaCellIterUnbarriered : public ArenaCellIterImpl +{ + public: + explicit ArenaCellIterUnbarriered(Arena* arena) + : ArenaCellIterImpl(arena, CellIterDoesntNeedBarrier) + {} +}; + template <typename T> class ZoneCellIter; template <> class ZoneCellIter<TenuredCell> { ArenaIter arenaIter; ArenaCellIterImpl cellIter; mozilla::Maybe<JS::AutoAssertNoGC> nogc;
--- a/js/src/vm/MemoryMetrics.cpp +++ b/js/src/vm/MemoryMetrics.cpp @@ -755,21 +755,21 @@ CollectRuntimeStatsHelper(JSContext* cx, IterateChunks(cx, &rtStats->gcHeapDecommittedArenas, DecommittedArenasChunkCallback); // Take the per-compartment measurements. StatsClosure closure(rtStats, opv, anonymize); if (!closure.init()) return false; - IterateZonesCompartmentsArenasCells(cx, &closure, - StatsZoneCallback, - StatsCompartmentCallback, - StatsArenaCallback, - statsCellCallback); + IterateHeapUnbarriered(cx, &closure, + StatsZoneCallback, + StatsCompartmentCallback, + StatsArenaCallback, + statsCellCallback); // Take the "explicit/js/runtime/" measurements. rt->addSizeOfIncludingThis(rtStats->mallocSizeOf_, &rtStats->runtime); if (!FindNotableScriptSources(rtStats->runtime)) return false; JS::ZoneStatsVector& zs = rtStats->zoneStatsVector; @@ -901,21 +901,21 @@ AddSizeOfTab(JSContext* cx, HandleObject if (!rtStats.zoneStatsVector.reserve(1)) return false; // Take the per-compartment measurements. No need to anonymize because // these measurements will be aggregated. StatsClosure closure(&rtStats, opv, /* anonymize = */ false); if (!closure.init()) return false; - IterateZoneCompartmentsArenasCells(cx, zone, &closure, - StatsZoneCallback, - StatsCompartmentCallback, - StatsArenaCallback, - StatsCellCallback<CoarseGrained>); + IterateHeapUnbarrieredForZone(cx, zone, &closure, + StatsZoneCallback, + StatsCompartmentCallback, + StatsArenaCallback, + StatsCellCallback<CoarseGrained>); MOZ_ASSERT(rtStats.zoneStatsVector.length() == 1); rtStats.zTotals.addSizes(rtStats.zoneStatsVector[0]); for (size_t i = 0; i < rtStats.compartmentStatsVector.length(); i++) rtStats.cTotals.addSizes(rtStats.compartmentStatsVector[i]); for (CompartmentsInZoneIter comp(zone); !comp.done(); comp.next())