зеркало из https://github.com/mozilla/gecko-dev.git
Bug 869235 - Disable Zone::needsBarrier during minor GCs; r=billm
--HG-- extra : rebase_source : be141178dc9cf2da06d9eb2f13189f1db0876433
This commit is contained in:
Родитель
1f146a74fb
Коммит
6850557d11
|
@ -181,7 +181,7 @@ class MinorCollectionTracer : public JSTracer
|
||||||
RelocationOverlay **tail;
|
RelocationOverlay **tail;
|
||||||
|
|
||||||
/* Save and restore all of the runtime state we use during MinorGC. */
|
/* Save and restore all of the runtime state we use during MinorGC. */
|
||||||
bool priorNeedsBarrier;
|
bool savedNeedsBarrier;
|
||||||
AutoDisableProxyCheck disableStrictProxyChecking;
|
AutoDisableProxyCheck disableStrictProxyChecking;
|
||||||
|
|
||||||
/* Insert the given relocation entry into the list of things to visit. */
|
/* Insert the given relocation entry into the list of things to visit. */
|
||||||
|
@ -198,7 +198,7 @@ class MinorCollectionTracer : public JSTracer
|
||||||
session(runtime, MinorCollecting),
|
session(runtime, MinorCollecting),
|
||||||
head(NULL),
|
head(NULL),
|
||||||
tail(&head),
|
tail(&head),
|
||||||
priorNeedsBarrier(runtime->needsBarrier()),
|
savedNeedsBarrier(runtime->needsBarrier()),
|
||||||
disableStrictProxyChecking(runtime)
|
disableStrictProxyChecking(runtime)
|
||||||
{
|
{
|
||||||
JS_TracerInit(this, runtime, Nursery::MinorGCCallback);
|
JS_TracerInit(this, runtime, Nursery::MinorGCCallback);
|
||||||
|
@ -206,10 +206,14 @@ class MinorCollectionTracer : public JSTracer
|
||||||
|
|
||||||
runtime->gcNumber++;
|
runtime->gcNumber++;
|
||||||
runtime->setNeedsBarrier(false);
|
runtime->setNeedsBarrier(false);
|
||||||
|
for (ZonesIter zone(rt); !zone.done(); zone.next())
|
||||||
|
zone->saveNeedsBarrier(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
~MinorCollectionTracer() {
|
~MinorCollectionTracer() {
|
||||||
runtime->setNeedsBarrier(priorNeedsBarrier);
|
runtime->setNeedsBarrier(savedNeedsBarrier);
|
||||||
|
for (ZonesIter zone(runtime); !zone.done(); zone.next())
|
||||||
|
zone->restoreNeedsBarrier();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -242,6 +246,14 @@ js::Nursery::allocateFromTenured(Zone *zone, AllocKind thingKind)
|
||||||
zone->allocator.arenas.checkEmptyFreeList(thingKind);
|
zone->allocator.arenas.checkEmptyFreeList(thingKind);
|
||||||
t = zone->allocator.arenas.allocateFromArena(zone, thingKind);
|
t = zone->allocator.arenas.allocateFromArena(zone, thingKind);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pre barriers are disabled during minor collection, however, we still
|
||||||
|
* want objects to be allocated black if an incremental GC is in progress.
|
||||||
|
*/
|
||||||
|
if (zone->savedNeedsBarrier())
|
||||||
|
static_cast<Cell *>(t)->markIfUnmarked();
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -113,10 +113,31 @@ struct Zone : private JS::shadow::Zone, public js::gc::GraphNodeBase<JS::Zone>
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool ionUsingBarriers_;
|
bool ionUsingBarriers_;
|
||||||
public:
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This flag saves the value of needsBarrier_ during minor collection,
|
||||||
|
* since needsBarrier_ is always set to false during minor collection.
|
||||||
|
* Outside of minor collection, the value of savedNeedsBarrier_ is
|
||||||
|
* undefined.
|
||||||
|
*/
|
||||||
|
bool savedNeedsBarrier_;
|
||||||
|
|
||||||
|
public:
|
||||||
bool active; // GC flag, whether there are active frames
|
bool active; // GC flag, whether there are active frames
|
||||||
|
|
||||||
|
void saveNeedsBarrier(bool newNeeds) {
|
||||||
|
savedNeedsBarrier_ = needsBarrier_;
|
||||||
|
needsBarrier_ = newNeeds;
|
||||||
|
}
|
||||||
|
|
||||||
|
void restoreNeedsBarrier() {
|
||||||
|
needsBarrier_ = savedNeedsBarrier_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool savedNeedsBarrier() const {
|
||||||
|
return savedNeedsBarrier_;
|
||||||
|
}
|
||||||
|
|
||||||
bool needsBarrier() const {
|
bool needsBarrier() const {
|
||||||
return needsBarrier_;
|
return needsBarrier_;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче