Fix crash when deleting Compositor parent, and change RPC calls to sync calls..

This commit is contained in:
Ali Juma 2011-12-20 10:37:27 -05:00
Родитель b1b3aa4a7e
Коммит d5d41885c3
7 изменённых файлов: 24 добавлений и 23 удалений

Просмотреть файл

@ -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;