// dispatched function static void ImageBridgeShutdownStep1(ReentrantMonitor *aBarrier, bool *aDone) { ReentrantMonitorAutoEnter autoMon(*aBarrier); MOZ_ASSERT(InImageBridgeChildThread(), "Should be in ImageBridgeChild thread."); MediaSystemResourceManager::Shutdown(); 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* client = TextureClient::AsTextureClient(textures[i]); if (client) { client->ForceRemove(); } } sImageBridgeChildSingleton->SendWillStop(); sImageBridgeChildSingleton->MarkShutDown(); // From now on, no message can be sent through the image bridge from the // client side except the final Stop message. } *aDone = true; aBarrier->NotifyAll(); }
void LayerTransactionChild::Destroy() { if (!IPCOpen()) { return; } // mDestroyed is used to prevent calling Send__delete__() twice. // When this function is called from CompositorChild::Destroy(), // under Send__delete__() call, this function is called from // ShadowLayerForwarder's destructor. // When it happens, IPCOpen() is still true. // See bug 1004191. mDestroyed = true; MOZ_ASSERT(0 == ManagedPLayerChild().Length(), "layers should have been cleaned up by now"); for (size_t i = 0; i < ManagedPTextureChild().Length(); ++i) { TextureClient* texture = TextureClient::AsTextureClient(ManagedPTextureChild()[i]); if (texture) { texture->ForceRemove(); } } SendShutdown(); }