Bug 737437 - Destroy the compositor's layer manager before the CompositorChild gets destroyed. r=cjones

This commit is contained in:
Ali Juma 2012-03-29 09:59:22 -04:00
parent 7bf2e7218c
commit b197ceb6eb
4 changed files with 19 additions and 3 deletions

View File

@ -78,14 +78,24 @@ CompositorParent::Destroy()
NS_ABORT_IF_FALSE(ManagedPLayersParent().Length() == 0,
"CompositorParent destroyed before managed PLayersParent");
// Ensure that the layer manager is destroyed on the compositor thread.
// Ensure that the layer manager is destructed on the compositor thread.
mLayerManager = NULL;
}
bool
CompositorParent::RecvWillStop()
{
mPaused = true;
// Ensure that the layer manager is destroyed before CompositorChild.
mLayerManager->Destroy();
return true;
}
bool
CompositorParent::RecvStop()
{
mPaused = true;
Destroy();
return true;
}

View File

@ -93,6 +93,7 @@ public:
CompositorParent(nsIWidget* aWidget, base::Thread* aCompositorThread);
virtual ~CompositorParent();
virtual bool RecvWillStop() MOZ_OVERRIDE;
virtual bool RecvStop() MOZ_OVERRIDE;
virtual bool RecvPause() MOZ_OVERRIDE;
virtual bool RecvResume() MOZ_OVERRIDE;

View File

@ -61,7 +61,10 @@ rpc protocol PCompositor
parent:
// Clean up in preparation for destruction.
// The child is about to be destroyed, so perform any necessary cleanup.
sync WillStop();
// Clean up in preparation for own destruction.
sync Stop();
// Pause/resume the compositor. These are intended to be used on mobile, when

View File

@ -153,6 +153,8 @@ nsBaseWidget::~nsBaseWidget()
}
if (mCompositorChild) {
mCompositorChild->SendWillStop();
MessageLoop::current()->RunAllPending();
mCompositorChild->Destroy();
delete mCompositorThread;
}