summaryrefslogtreecommitdiffstats
path: root/widget/windows/WinCompositorWidget.cpp
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@gmail.com>2018-09-11 11:55:16 +0200
committerwolfbeast <mcwerewolf@gmail.com>2018-09-11 11:55:16 +0200
commit6ded94d38cf94a5da8d6a73dfbfca2acb0d719cc (patch)
treef78a8681518066053e5c301fcf0696ea161e5bf0 /widget/windows/WinCompositorWidget.cpp
parent1de1ce5770f45c0b8601a8148d622b272b4ccdbb (diff)
downloadUXP-6ded94d38cf94a5da8d6a73dfbfca2acb0d719cc.tar
UXP-6ded94d38cf94a5da8d6a73dfbfca2acb0d719cc.tar.gz
UXP-6ded94d38cf94a5da8d6a73dfbfca2acb0d719cc.tar.lz
UXP-6ded94d38cf94a5da8d6a73dfbfca2acb0d719cc.tar.xz
UXP-6ded94d38cf94a5da8d6a73dfbfca2acb0d719cc.zip
Bug 1467363 - Protect access to mTransparentSurface with a lock.
Diffstat (limited to 'widget/windows/WinCompositorWidget.cpp')
-rw-r--r--widget/windows/WinCompositorWidget.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/widget/windows/WinCompositorWidget.cpp b/widget/windows/WinCompositorWidget.cpp
index f660bd019..99ce67573 100644
--- a/widget/windows/WinCompositorWidget.cpp
+++ b/widget/windows/WinCompositorWidget.cpp
@@ -22,6 +22,7 @@ using namespace mozilla::gfx;
WinCompositorWidget::WinCompositorWidget(const CompositorWidgetInitData& aInitData)
: mWidgetKey(aInitData.widgetKey()),
mWnd(reinterpret_cast<HWND>(aInitData.hWnd())),
+ mTransparentSurfaceLock("mTransparentSurfaceLock"),
mTransparencyMode(static_cast<nsTransparencyMode>(aInitData.transparencyMode())),
mMemoryDC(nullptr),
mCompositeDC(nullptr),
@@ -39,6 +40,7 @@ WinCompositorWidget::WinCompositorWidget(const CompositorWidgetInitData& aInitDa
void
WinCompositorWidget::OnDestroyWindow()
{
+ MutexAutoLock lock(mTransparentSurfaceLock);
mTransparentSurface = nullptr;
mMemoryDC = nullptr;
}
@@ -75,6 +77,8 @@ WinCompositorWidget::GetClientSize()
already_AddRefed<gfx::DrawTarget>
WinCompositorWidget::StartRemoteDrawing()
{
+ MutexAutoLock lock(mTransparentSurfaceLock);
+
MOZ_ASSERT(!mCompositeDC);
RefPtr<gfxASurface> surf;
@@ -229,6 +233,7 @@ WinCompositorWidget::LeavePresentLock()
RefPtr<gfxASurface>
WinCompositorWidget::EnsureTransparentSurface()
{
+ mTransparentSurfaceLock.AssertCurrentThreadOwns();
MOZ_ASSERT(mTransparencyMode == eTransparencyTransparent);
IntSize size = GetClientSize().ToUnknownSize();
@@ -245,6 +250,7 @@ WinCompositorWidget::EnsureTransparentSurface()
void
WinCompositorWidget::CreateTransparentSurface(const gfx::IntSize& aSize)
{
+ mTransparentSurfaceLock.AssertCurrentThreadOwns();
MOZ_ASSERT(!mTransparentSurface && !mMemoryDC);
RefPtr<gfxWindowsSurface> surface = new gfxWindowsSurface(aSize, SurfaceFormat::A8R8G8B8_UINT32);
mTransparentSurface = surface;
@@ -254,6 +260,7 @@ WinCompositorWidget::CreateTransparentSurface(const gfx::IntSize& aSize)
void
WinCompositorWidget::UpdateTransparency(nsTransparencyMode aMode)
{
+ MutexAutoLock lock(mTransparentSurfaceLock);
if (mTransparencyMode == aMode) {
return;
}
@@ -270,6 +277,7 @@ WinCompositorWidget::UpdateTransparency(nsTransparencyMode aMode)
void
WinCompositorWidget::ClearTransparentWindow()
{
+ MutexAutoLock lock(mTransparentSurfaceLock);
if (!mTransparentSurface) {
return;
}