Bug 1150944 - Remove objects that have been unlinked by the cycle collector from the demotable context list. r=ehsan

This commit is contained in:
Matt Woodrow 2015-07-29 16:35:55 -04:00
parent 9e32407045
commit e618aa2689
2 changed files with 10 additions and 0 deletions

View File

@ -859,6 +859,9 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(CanvasRenderingContext2D)
NS_IMPL_CYCLE_COLLECTION_CLASS(CanvasRenderingContext2D) NS_IMPL_CYCLE_COLLECTION_CLASS(CanvasRenderingContext2D)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CanvasRenderingContext2D) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CanvasRenderingContext2D)
// Make sure we remove ourselves from the list of demotable contexts (raw pointers),
// since we're logically destructed at this point.
CanvasRenderingContext2D::RemoveDemotableContext(tmp);
NS_IMPL_CYCLE_COLLECTION_UNLINK(mCanvasElement) NS_IMPL_CYCLE_COLLECTION_UNLINK(mCanvasElement)
for (uint32_t i = 0; i < tmp->mStyleStack.Length(); i++) { for (uint32_t i = 0; i < tmp->mStyleStack.Length(); i++) {
ImplCycleCollectionUnlink(tmp->mStyleStack[i].patternStyles[Style::STROKE]); ImplCycleCollectionUnlink(tmp->mStyleStack[i].patternStyles[Style::STROKE]);
@ -1238,6 +1241,10 @@ void CanvasRenderingContext2D::Demote()
std::vector<CanvasRenderingContext2D*>& std::vector<CanvasRenderingContext2D*>&
CanvasRenderingContext2D::DemotableContexts() CanvasRenderingContext2D::DemotableContexts()
{ {
// This is a list of raw pointers to cycle-collected objects. We need to ensure
// that we remove elements from it during UNLINK (which can happen considerably before
// the actual destructor) since the object is logically destroyed at that point
// and will be in an inconsistant state.
static std::vector<CanvasRenderingContext2D*> contexts; static std::vector<CanvasRenderingContext2D*> contexts;
return contexts; return contexts;
} }

View File

@ -685,6 +685,9 @@ protected:
return CurrentState().font; return CurrentState().font;
} }
// This function maintains a list of raw pointers to cycle-collected
// objects. We need to ensure that no entries persist beyond unlink,
// since the objects are logically destructed at that point.
static std::vector<CanvasRenderingContext2D*>& DemotableContexts(); static std::vector<CanvasRenderingContext2D*>& DemotableContexts();
static void DemoteOldestContextIfNecessary(); static void DemoteOldestContextIfNecessary();