зеркало из https://github.com/mozilla/gecko-dev.git
Fix crash when deleting Compositor parent, and change RPC calls to sync calls..
This commit is contained in:
Родитель
b1b3aa4a7e
Коммит
d5d41885c3
|
@ -66,28 +66,27 @@ CompositorChild::~CompositorChild()
|
|||
void
|
||||
CompositorChild::Destroy()
|
||||
{
|
||||
CallStop();
|
||||
SendStop();
|
||||
}
|
||||
|
||||
CompositorChild*
|
||||
CompositorChild::CreateCompositor(LayerManager *aLayerManager)
|
||||
CompositorChild::CreateCompositor(LayerManager *aLayerManager,
|
||||
CompositorParent *aCompositorParent)
|
||||
{
|
||||
Thread* compositorThread = new Thread("CompositorThread");
|
||||
if (compositorThread->Start()) {
|
||||
MessageLoop *parentMessageLoop = MessageLoop::current();
|
||||
MessageLoop *childMessageLoop = compositorThread->message_loop();
|
||||
CompositorParent* compositorParent = new CompositorParent();
|
||||
CompositorChild *compositorChild = new CompositorChild(compositorThread, aLayerManager);
|
||||
mozilla::ipc::AsyncChannel *parentChannel =
|
||||
compositorParent->GetIPCChannel();
|
||||
aCompositorParent->GetIPCChannel();
|
||||
mozilla::ipc::AsyncChannel *childChannel =
|
||||
compositorChild->GetIPCChannel();
|
||||
mozilla::ipc::AsyncChannel::Side childSide =
|
||||
mozilla::ipc::AsyncChannel::Child;
|
||||
|
||||
compositorChild->Open(parentChannel, childMessageLoop, childSide);
|
||||
compositorChild->CallInit();
|
||||
compositorChild->mCompositorParent = compositorParent;
|
||||
compositorChild->SendInit();
|
||||
|
||||
return compositorChild;
|
||||
}
|
||||
|
|
|
@ -62,7 +62,8 @@ public:
|
|||
|
||||
void Destroy();
|
||||
|
||||
static CompositorChild* CreateCompositor(LayerManager *aLayerManager);
|
||||
static CompositorChild* CreateCompositor(LayerManager *aLayerManager,
|
||||
CompositorParent *aCompositorParent);
|
||||
|
||||
protected:
|
||||
CompositorChild(Thread* aCompositorThread, LayerManager *aLayerManager);
|
||||
|
|
|
@ -54,12 +54,11 @@ CompositorParent::CompositorParent()
|
|||
CompositorParent::~CompositorParent()
|
||||
{
|
||||
printf("delete parent\n");
|
||||
delete mLayerManager;
|
||||
MOZ_COUNT_DTOR(CompositorParent);
|
||||
}
|
||||
|
||||
bool
|
||||
CompositorParent::AnswerInit()
|
||||
CompositorParent::RecvInit()
|
||||
{
|
||||
CancelableTask *composeTask = NewRunnableMethod(this, &CompositorParent::Composite);
|
||||
MessageLoop::current()->PostTask(FROM_HERE, composeTask);
|
||||
|
@ -67,12 +66,8 @@ CompositorParent::AnswerInit()
|
|||
}
|
||||
|
||||
bool
|
||||
CompositorParent::AnswerStop()
|
||||
CompositorParent::RecvStop()
|
||||
{
|
||||
if (mLayerManager) {
|
||||
delete mLayerManager;
|
||||
mLayerManager = NULL;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -57,8 +57,8 @@ public:
|
|||
CompositorParent();
|
||||
virtual ~CompositorParent();
|
||||
|
||||
bool AnswerInit();
|
||||
bool AnswerStop();
|
||||
bool RecvInit();
|
||||
bool RecvStop();
|
||||
|
||||
void RequestComposition();
|
||||
|
||||
|
@ -73,7 +73,7 @@ protected:
|
|||
private:
|
||||
void Composite();
|
||||
|
||||
LayerManager *mLayerManager;
|
||||
nsRefPtr<LayerManager> mLayerManager;
|
||||
|
||||
DISALLOW_EVIL_CONSTRUCTORS(CompositorParent);
|
||||
};
|
||||
|
|
|
@ -74,8 +74,8 @@ rpc protocol PCompositor
|
|||
|
||||
parent:
|
||||
|
||||
rpc Init();
|
||||
rpc Stop();
|
||||
sync Init();
|
||||
sync Stop();
|
||||
|
||||
async PLayers(LayersBackend backend, WidgetDescriptor widgetDescriptor);
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "mozilla/Util.h"
|
||||
|
||||
#include "mozilla/layers/CompositorChild.h"
|
||||
#include "mozilla/layers/CompositorParent.h"
|
||||
#include "nsBaseWidget.h"
|
||||
#include "nsDeviceContext.h"
|
||||
#include "nsCOMPtr.h"
|
||||
|
@ -141,15 +142,16 @@ nsBaseWidget::~nsBaseWidget()
|
|||
static_cast<BasicLayerManager*>(mLayerManager.get())->ClearRetainerWidget();
|
||||
}
|
||||
|
||||
if (mCompositor) {
|
||||
mCompositor->Destroy();
|
||||
}
|
||||
|
||||
if (mLayerManager) {
|
||||
mLayerManager->Destroy();
|
||||
mLayerManager = NULL;
|
||||
}
|
||||
|
||||
if (mCompositor) {
|
||||
mCompositor->Destroy();
|
||||
}
|
||||
|
||||
#ifdef NOISY_WIDGET_LEAKS
|
||||
gNumWidgets--;
|
||||
printf("WIDGETS- = %d\n", gNumWidgets);
|
||||
|
@ -836,7 +838,8 @@ LayerManager* nsBaseWidget::GetLayerManager(PLayersChild* aShadowManager,
|
|||
Preferences::GetBool("layers.offmainthreadcomposition.enabled", false);
|
||||
if (useCompositor) {
|
||||
LayerManager* lm = CreateBasicLayerManager();
|
||||
mCompositor = CompositorChild::CreateCompositor(lm);
|
||||
mCompositorParent = new CompositorParent();
|
||||
mCompositor = CompositorChild::CreateCompositor(lm, mCompositorParent);
|
||||
|
||||
if (mCompositor) {
|
||||
// e10s uses the parameter to pass in the shadow manager from the TabChild
|
||||
|
|
|
@ -54,10 +54,12 @@ class gfxContext;
|
|||
namespace mozilla {
|
||||
namespace layers {
|
||||
class CompositorChild;
|
||||
class CompositorParent;
|
||||
}
|
||||
}
|
||||
|
||||
using mozilla::layers::CompositorChild;
|
||||
using mozilla::layers::CompositorParent;
|
||||
|
||||
/**
|
||||
* Common widget implementation used as base class for native
|
||||
|
@ -277,6 +279,7 @@ protected:
|
|||
nsRefPtr<LayerManager> mLayerManager;
|
||||
nsRefPtr<LayerManager> mBasicLayerManager;
|
||||
nsRefPtr<CompositorChild> mCompositor;
|
||||
nsRefPtr<CompositorParent> mCompositorParent;
|
||||
nscolor mBackground;
|
||||
nscolor mForeground;
|
||||
nsCursor mCursor;
|
||||
|
|
Загрузка…
Ссылка в новой задаче