Backed out changeset fbb86a21aba0 (bug 924622) for leaks on OS X 10.6; CLOSED TREE

This commit is contained in:
Ed Morley 2014-04-25 17:51:42 +01:00
parent 654e84274f
commit 6a82d86fc3
4 changed files with 12 additions and 70 deletions

View File

@ -173,33 +173,13 @@ static void StopImageBridgeSync(ReentrantMonitor *aBarrier, bool *aDone)
NS_ABORT_IF_FALSE(InImageBridgeChildThread(), NS_ABORT_IF_FALSE(InImageBridgeChildThread(),
"Should be in ImageBridgeChild thread."); "Should be in ImageBridgeChild thread.");
if (sImageBridgeChildSingleton) { if (sImageBridgeChildSingleton) {
// Force all managed protocols to shut themselves down cleanly
InfallibleTArray<PCompositableChild*> compositables;
sImageBridgeChildSingleton->ManagedPCompositableChild(compositables);
for (int i = compositables.Length() - 1; i >= 0; --i) {
CompositableClient::FromIPDLActor(compositables[i])->Destroy();
}
InfallibleTArray<PTextureChild*> textures;
sImageBridgeChildSingleton->ManagedPTextureChild(textures);
for (int i = textures.Length() - 1; i >= 0; --i) {
TextureClient::AsTextureClient(textures[i])->ForceRemove();
}
sImageBridgeChildSingleton->SendStop(); sImageBridgeChildSingleton->SendStop();
sImageBridgeChildSingleton->MarkShutDown();
// From now on, no message can be sent through the image bridge from the
// client side.
} }
*aDone = true; *aDone = true;
aBarrier->NotifyAll(); aBarrier->NotifyAll();
} }
void
ImageBridgeChild::MarkShutDown()
{
MOZ_ASSERT(!mShuttingDown);
mShuttingDown = true;
}
// dispatched function // dispatched function
static void DeleteImageBridgeSync(ReentrantMonitor *aBarrier, bool *aDone) static void DeleteImageBridgeSync(ReentrantMonitor *aBarrier, bool *aDone)
{ {
@ -271,7 +251,6 @@ static void ConnectImageBridge(ImageBridgeChild * child, ImageBridgeParent * par
} }
ImageBridgeChild::ImageBridgeChild() ImageBridgeChild::ImageBridgeChild()
: mShuttingDown(false)
{ {
mTxn = new CompositableTransaction(); mTxn = new CompositableTransaction();
} }
@ -284,7 +263,6 @@ void
ImageBridgeChild::Connect(CompositableClient* aCompositable) ImageBridgeChild::Connect(CompositableClient* aCompositable)
{ {
MOZ_ASSERT(aCompositable); MOZ_ASSERT(aCompositable);
MOZ_ASSERT(!mShuttingDown);
uint64_t id = 0; uint64_t id = 0;
PCompositableChild* child = PCompositableChild* child =
SendPCompositableConstructor(aCompositable->GetTextureInfo(), &id); SendPCompositableConstructor(aCompositable->GetTextureInfo(), &id);
@ -295,7 +273,6 @@ ImageBridgeChild::Connect(CompositableClient* aCompositable)
PCompositableChild* PCompositableChild*
ImageBridgeChild::AllocPCompositableChild(const TextureInfo& aInfo, uint64_t* aID) ImageBridgeChild::AllocPCompositableChild(const TextureInfo& aInfo, uint64_t* aID)
{ {
MOZ_ASSERT(!mShuttingDown);
return CompositableClient::CreateIPDLActor(); return CompositableClient::CreateIPDLActor();
} }
@ -359,10 +336,6 @@ static void ReleaseImageClientNow(ImageClient* aClient)
// static // static
void ImageBridgeChild::DispatchReleaseImageClient(ImageClient* aClient) void ImageBridgeChild::DispatchReleaseImageClient(ImageClient* aClient)
{ {
if (!IsCreated()) {
return;
}
sImageBridgeChildSingleton->GetMessageLoop()->PostTask( sImageBridgeChildSingleton->GetMessageLoop()->PostTask(
FROM_HERE, FROM_HERE,
NewRunnableFunction(&ReleaseImageClientNow, aClient)); NewRunnableFunction(&ReleaseImageClientNow, aClient));
@ -377,10 +350,6 @@ static void ReleaseTextureClientNow(TextureClient* aClient)
// static // static
void ImageBridgeChild::DispatchReleaseTextureClient(TextureClient* aClient) void ImageBridgeChild::DispatchReleaseTextureClient(TextureClient* aClient)
{ {
if (!IsCreated()) {
return;
}
sImageBridgeChildSingleton->GetMessageLoop()->PostTask( sImageBridgeChildSingleton->GetMessageLoop()->PostTask(
FROM_HERE, FROM_HERE,
NewRunnableFunction(&ReleaseTextureClientNow, aClient)); NewRunnableFunction(&ReleaseTextureClientNow, aClient));
@ -400,10 +369,6 @@ static void UpdateImageClientNow(ImageClient* aClient, ImageContainer* aContaine
void ImageBridgeChild::DispatchImageClientUpdate(ImageClient* aClient, void ImageBridgeChild::DispatchImageClientUpdate(ImageClient* aClient,
ImageContainer* aContainer) ImageContainer* aContainer)
{ {
if (!IsCreated()) {
return;
}
if (InImageBridgeChildThread()) { if (InImageBridgeChildThread()) {
UpdateImageClientNow(aClient, aContainer); UpdateImageClientNow(aClient, aContainer);
return; return;
@ -428,10 +393,6 @@ static void FlushAllImagesSync(ImageClient* aClient, ImageContainer* aContainer,
//static //static
void ImageBridgeChild::FlushAllImages(ImageClient* aClient, ImageContainer* aContainer, bool aExceptFront) void ImageBridgeChild::FlushAllImages(ImageClient* aClient, ImageContainer* aContainer, bool aExceptFront)
{ {
if (!IsCreated()) {
return;
}
if (InImageBridgeChildThread()) { if (InImageBridgeChildThread()) {
FlushAllImagesNow(aClient, aContainer, aExceptFront); FlushAllImagesNow(aClient, aContainer, aExceptFront);
return; return;
@ -456,7 +417,6 @@ void ImageBridgeChild::FlushAllImages(ImageClient* aClient, ImageContainer* aCon
void ImageBridgeChild::FlushAllImagesNow(ImageClient* aClient, ImageContainer* aContainer, bool aExceptFront) void ImageBridgeChild::FlushAllImagesNow(ImageClient* aClient, ImageContainer* aContainer, bool aExceptFront)
{ {
MOZ_ASSERT(aClient); MOZ_ASSERT(aClient);
MOZ_ASSERT(!sImageBridgeChildSingleton->mShuttingDown);
sImageBridgeChildSingleton->BeginTransaction(); sImageBridgeChildSingleton->BeginTransaction();
if (aContainer && !aExceptFront) { if (aContainer && !aExceptFront) {
aContainer->ClearCurrentImage(); aContainer->ClearCurrentImage();
@ -469,7 +429,6 @@ void ImageBridgeChild::FlushAllImagesNow(ImageClient* aClient, ImageContainer* a
void void
ImageBridgeChild::BeginTransaction() ImageBridgeChild::BeginTransaction()
{ {
MOZ_ASSERT(!mShuttingDown);
MOZ_ASSERT(mTxn->Finished(), "uncommitted txn?"); MOZ_ASSERT(mTxn->Finished(), "uncommitted txn?");
mTxn->Begin(); mTxn->Begin();
} }
@ -491,7 +450,6 @@ private:
void void
ImageBridgeChild::EndTransaction() ImageBridgeChild::EndTransaction()
{ {
MOZ_ASSERT(!mShuttingDown);
MOZ_ASSERT(!mTxn->Finished(), "forgot BeginTransaction?"); MOZ_ASSERT(!mTxn->Finished(), "forgot BeginTransaction?");
AutoEndTransaction _(mTxn); AutoEndTransaction _(mTxn);
@ -587,7 +545,6 @@ void ImageBridgeChild::ShutDown()
{ {
NS_ASSERTION(NS_IsMainThread(), "Should be on the main Thread!"); NS_ASSERTION(NS_IsMainThread(), "Should be on the main Thread!");
if (ImageBridgeChild::IsCreated()) { if (ImageBridgeChild::IsCreated()) {
MOZ_ASSERT(!sImageBridgeChildSingleton->mShuttingDown);
ImageBridgeChild::DestroyBridge(); ImageBridgeChild::DestroyBridge();
delete sImageBridgeChildThread; delete sImageBridgeChildThread;
sImageBridgeChildThread = nullptr; sImageBridgeChildThread = nullptr;
@ -614,14 +571,15 @@ bool ImageBridgeChild::StartUpOnThread(Thread* aThread)
void ImageBridgeChild::DestroyBridge() void ImageBridgeChild::DestroyBridge()
{ {
if (!IsCreated()) {
return;
}
NS_ABORT_IF_FALSE(!InImageBridgeChildThread(), NS_ABORT_IF_FALSE(!InImageBridgeChildThread(),
"This method must not be called in this thread."); "This method must not be called in this thread.");
// ...because we are about to dispatch synchronous messages to the // ...because we are about to dispatch synchronous messages to the
// ImageBridgeChild thread. // ImageBridgeChild thread.
if (!IsCreated()) {
return;
}
ReentrantMonitor barrier("ImageBridgeDestroyTask lock"); ReentrantMonitor barrier("ImageBridgeDestroyTask lock");
ReentrantMonitorAutoEnter autoMon(barrier); ReentrantMonitorAutoEnter autoMon(barrier);
@ -643,8 +601,7 @@ void ImageBridgeChild::DestroyBridge()
bool InImageBridgeChildThread() bool InImageBridgeChildThread()
{ {
return ImageBridgeChild::IsCreated() && return sImageBridgeChildThread->thread_id() == PlatformThread::CurrentId();
sImageBridgeChildThread->thread_id() == PlatformThread::CurrentId();
} }
MessageLoop * ImageBridgeChild::GetMessageLoop() const MessageLoop * ImageBridgeChild::GetMessageLoop() const
@ -690,7 +647,6 @@ ImageBridgeChild::CreateImageClient(CompositableType aType)
TemporaryRef<ImageClient> TemporaryRef<ImageClient>
ImageBridgeChild::CreateImageClientNow(CompositableType aType) ImageBridgeChild::CreateImageClientNow(CompositableType aType)
{ {
MOZ_ASSERT(!sImageBridgeChildSingleton->mShuttingDown);
RefPtr<ImageClient> client RefPtr<ImageClient> client
= ImageClient::CreateImageClient(aType, this, 0); = ImageClient::CreateImageClient(aType, this, 0);
MOZ_ASSERT(client, "failed to create ImageClient"); MOZ_ASSERT(client, "failed to create ImageClient");
@ -704,7 +660,6 @@ PGrallocBufferChild*
ImageBridgeChild::AllocPGrallocBufferChild(const IntSize&, const uint32_t&, const uint32_t&, ImageBridgeChild::AllocPGrallocBufferChild(const IntSize&, const uint32_t&, const uint32_t&,
MaybeMagicGrallocBufferHandle*) MaybeMagicGrallocBufferHandle*)
{ {
MOZ_ASSERT(!mShuttingDown);
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC #ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
return GrallocBufferActor::Create(); return GrallocBufferActor::Create();
#else #else
@ -716,7 +671,6 @@ ImageBridgeChild::AllocPGrallocBufferChild(const IntSize&, const uint32_t&, cons
bool bool
ImageBridgeChild::DeallocPGrallocBufferChild(PGrallocBufferChild* actor) ImageBridgeChild::DeallocPGrallocBufferChild(PGrallocBufferChild* actor)
{ {
MOZ_ASSERT(!mShuttingDown);
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC #ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
delete actor; delete actor;
return true; return true;
@ -731,7 +685,6 @@ ImageBridgeChild::AllocUnsafeShmem(size_t aSize,
ipc::SharedMemory::SharedMemoryType aType, ipc::SharedMemory::SharedMemoryType aType,
ipc::Shmem* aShmem) ipc::Shmem* aShmem)
{ {
MOZ_ASSERT(!mShuttingDown);
if (InImageBridgeChildThread()) { if (InImageBridgeChildThread()) {
return PImageBridgeChild::AllocUnsafeShmem(aSize, aType, aShmem); return PImageBridgeChild::AllocUnsafeShmem(aSize, aType, aShmem);
} else { } else {
@ -744,7 +697,6 @@ ImageBridgeChild::AllocShmem(size_t aSize,
ipc::SharedMemory::SharedMemoryType aType, ipc::SharedMemory::SharedMemoryType aType,
ipc::Shmem* aShmem) ipc::Shmem* aShmem)
{ {
MOZ_ASSERT(!mShuttingDown);
if (InImageBridgeChildThread()) { if (InImageBridgeChildThread()) {
return PImageBridgeChild::AllocShmem(aSize, aType, aShmem); return PImageBridgeChild::AllocShmem(aSize, aType, aShmem);
} else { } else {
@ -884,7 +836,6 @@ ImageBridgeChild::AllocGrallocBufferNow(const gfx::IntSize& aSize,
MaybeMagicGrallocBufferHandle* aHandle, MaybeMagicGrallocBufferHandle* aHandle,
PGrallocBufferChild** aChild) PGrallocBufferChild** aChild)
{ {
MOZ_ASSERT(!mShuttingDown);
#ifdef MOZ_WIDGET_GONK #ifdef MOZ_WIDGET_GONK
*aChild = SendPGrallocBufferConstructor(aSize, *aChild = SendPGrallocBufferConstructor(aSize,
aFormat, aFormat,
@ -947,7 +898,6 @@ PTextureChild*
ImageBridgeChild::AllocPTextureChild(const SurfaceDescriptor&, ImageBridgeChild::AllocPTextureChild(const SurfaceDescriptor&,
const TextureFlags&) const TextureFlags&)
{ {
MOZ_ASSERT(!mShuttingDown);
return TextureClient::CreateIPDLActor(); return TextureClient::CreateIPDLActor();
} }
@ -961,7 +911,6 @@ PTextureChild*
ImageBridgeChild::CreateTexture(const SurfaceDescriptor& aSharedData, ImageBridgeChild::CreateTexture(const SurfaceDescriptor& aSharedData,
TextureFlags aFlags) TextureFlags aFlags)
{ {
MOZ_ASSERT(!mShuttingDown);
return SendPTextureConstructor(aSharedData, aFlags); return SendPTextureConstructor(aSharedData, aFlags);
} }
@ -969,7 +918,6 @@ void
ImageBridgeChild::RemoveTextureFromCompositable(CompositableClient* aCompositable, ImageBridgeChild::RemoveTextureFromCompositable(CompositableClient* aCompositable,
TextureClient* aTexture) TextureClient* aTexture)
{ {
MOZ_ASSERT(!mShuttingDown);
if (aTexture->GetFlags() & TEXTURE_DEALLOCATE_CLIENT) { if (aTexture->GetFlags() & TEXTURE_DEALLOCATE_CLIENT) {
mTxn->AddEdit(OpRemoveTexture(nullptr, aCompositable->GetIPDLActor(), mTxn->AddEdit(OpRemoveTexture(nullptr, aCompositable->GetIPDLActor(),
nullptr, aTexture->GetIPDLActor())); nullptr, aTexture->GetIPDLActor()));
@ -993,7 +941,6 @@ static void RemoveTextureSync(TextureClient* aTexture, ReentrantMonitor* aBarrie
void ImageBridgeChild::RemoveTexture(TextureClient* aTexture) void ImageBridgeChild::RemoveTexture(TextureClient* aTexture)
{ {
if (InImageBridgeChildThread()) { if (InImageBridgeChildThread()) {
MOZ_ASSERT(!mShuttingDown);
aTexture->ForceRemove(); aTexture->ForceRemove();
return; return;
} }

View File

@ -314,7 +314,6 @@ public:
uint32_t aFormat, uint32_t aUsage, uint32_t aFormat, uint32_t aUsage,
MaybeMagicGrallocBufferHandle* aHandle, MaybeMagicGrallocBufferHandle* aHandle,
PGrallocBufferChild** aChild); PGrallocBufferChild** aChild);
void MarkShutDown();
protected: protected:
ImageBridgeChild(); ImageBridgeChild();
bool DispatchAllocShmemInternal(size_t aSize, bool DispatchAllocShmemInternal(size_t aSize,
@ -330,8 +329,6 @@ protected:
MaybeMagicGrallocBufferHandle* aHandle) MOZ_OVERRIDE; MaybeMagicGrallocBufferHandle* aHandle) MOZ_OVERRIDE;
virtual void DeallocGrallocBuffer(PGrallocBufferChild* aChild) MOZ_OVERRIDE; virtual void DeallocGrallocBuffer(PGrallocBufferChild* aChild) MOZ_OVERRIDE;
bool mShuttingDown;
}; };
} // layers } // layers

View File

@ -493,6 +493,12 @@ gfxPlatform::Shutdown()
mozilla::gl::GLContextProviderEGL::Shutdown(); mozilla::gl::GLContextProviderEGL::Shutdown();
#endif #endif
// This will block this thread untill the ImageBridge protocol is completely
// deleted.
ImageBridgeChild::ShutDown();
CompositorParent::ShutDown();
delete gGfxPlatformPrefsLock; delete gGfxPlatformPrefsLock;
gfxPrefs::DestroySingleton(); gfxPrefs::DestroySingleton();

View File

@ -129,9 +129,6 @@ extern nsresult nsStringInputStreamConstructor(nsISupports *, REFNSIID, void **)
#include "mozilla/ClearOnShutdown.h" #include "mozilla/ClearOnShutdown.h"
#include "mozilla/SystemMemoryReporter.h" #include "mozilla/SystemMemoryReporter.h"
#include "mozilla/layers/ImageBridgeChild.h"
#include "mozilla/layers/CompositorParent.h"
#ifdef MOZ_VISUAL_EVENT_TRACER #ifdef MOZ_VISUAL_EVENT_TRACER
#include "mozilla/VisualEventTracer.h" #include "mozilla/VisualEventTracer.h"
#endif #endif
@ -781,11 +778,6 @@ ShutdownXPCOM(nsIServiceManager* servMgr)
} }
} }
// This must happen after the shutdown of media and widgets, which
// are triggered by the NS_XPCOM_SHUTDOWN_OBSERVER_ID notification.
mozilla::layers::ImageBridgeChild::ShutDown();
mozilla::layers::CompositorParent::ShutDown();
NS_ProcessPendingEvents(thread); NS_ProcessPendingEvents(thread);
mozilla::scache::StartupCache::DeleteSingleton(); mozilla::scache::StartupCache::DeleteSingleton();
if (observerService) if (observerService)