diff options
Diffstat (limited to '0002-ozone-wayland-Use-mutex-before-accessing-surfaces-ma.patch')
-rw-r--r-- | 0002-ozone-wayland-Use-mutex-before-accessing-surfaces-ma.patch | 276 |
1 files changed, 0 insertions, 276 deletions
diff --git a/0002-ozone-wayland-Use-mutex-before-accessing-surfaces-ma.patch b/0002-ozone-wayland-Use-mutex-before-accessing-surfaces-ma.patch deleted file mode 100644 index afc444445c70..000000000000 --- a/0002-ozone-wayland-Use-mutex-before-accessing-surfaces-ma.patch +++ /dev/null @@ -1,276 +0,0 @@ -From 32995db96a44b8110baae213b098a70cacbad9d3 Mon Sep 17 00:00:00 2001 -From: Maksim Sisov <msisov@igalia.com> -Date: Mon, 5 Aug 2019 16:14:47 +0300 -Subject: [PATCH 2/6] [ozone/wayland] Use mutex before accessing surfaces map. - -We must make sure that accessing surfaces map from different threads -is safe. Otherwise, this is subject to races and unexpected crashes. - -Bug: 987950 -Change-Id: I2e70e9c1ad48943be518c3571b7ca1fb91f8d51b ---- - ui/ozone/platform/wayland/BUILD.gn | 1 + - .../wayland/gpu/gbm_pixmap_wayland.cc | 6 +- - .../wayland/gpu/gbm_surfaceless_wayland.cc | 2 +- - .../wayland/gpu/wayland_buffer_manager_gpu.cc | 61 ++++++++----------- - .../wayland/gpu/wayland_buffer_manager_gpu.h | 14 ++++- - .../wayland/gpu/wayland_canvas_surface.cc | 2 +- - .../wayland/gpu/wayland_surface_gpu.cc | 16 +++++ - .../wayland/gpu/wayland_surface_gpu.h | 13 +++- - 8 files changed, 72 insertions(+), 43 deletions(-) - create mode 100644 ui/ozone/platform/wayland/gpu/wayland_surface_gpu.cc - -diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn -index 95f20b1fb288..3dbb00bc6239 100644 ---- a/ui/ozone/platform/wayland/BUILD.gn -+++ b/ui/ozone/platform/wayland/BUILD.gn -@@ -30,6 +30,7 @@ source_set("wayland") { - "gpu/wayland_canvas_surface.h", - "gpu/wayland_surface_factory.cc", - "gpu/wayland_surface_factory.h", -+ "gpu/wayland_surface_gpu.cc", - "gpu/wayland_surface_gpu.h", - "host/wayland_buffer_manager_connector.cc", - "host/wayland_buffer_manager_connector.h", -diff --git a/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc b/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc -index 72d2419b5f84..48f2a7f655bd 100644 ---- a/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc -+++ b/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc -@@ -135,10 +135,10 @@ bool GbmPixmapWayland::ScheduleOverlayPlane( - const gfx::RectF& crop_rect, - bool enable_blend, - std::unique_ptr<gfx::GpuFence> gpu_fence) { -- auto* surface = buffer_manager_->GetSurface(widget); -- DCHECK(surface); -+ auto surface_weak = buffer_manager_->GetSurface(widget); -+ DCHECK(surface_weak); - GbmSurfacelessWayland* surfaceless = -- static_cast<GbmSurfacelessWayland*>(surface); -+ static_cast<GbmSurfacelessWayland*>(surface_weak.get()); - DCHECK(surfaceless); - - surfaceless->QueueOverlayPlane( -diff --git a/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc b/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc -index 70ea08acfa11..0554e772f5cb 100644 ---- a/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc -+++ b/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc -@@ -34,7 +34,7 @@ GbmSurfacelessWayland::GbmSurfacelessWayland( - has_implicit_external_sync_( - HasEGLExtension("EGL_ARM_implicit_external_sync")), - weak_factory_(this) { -- buffer_manager_->RegisterSurface(widget_, this); -+ buffer_manager_->RegisterSurface(widget_, GetWeakPtr()); - unsubmitted_frames_.push_back(std::make_unique<PendingFrame>()); - } - -diff --git a/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc b/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc -index 63bfa3032fde..f113a9887bdc 100644 ---- a/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc -+++ b/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc -@@ -43,19 +43,13 @@ void WaylandBufferManagerGpu::OnSubmission(gfx::AcceleratedWidget widget, - gfx::SwapResult swap_result) { - DCHECK(io_thread_runner_->BelongsToCurrentThread()); - DCHECK_NE(widget, gfx::kNullAcceleratedWidget); -- auto* surface = GetSurface(widget); -- // There can be a race between destruction and submitting the last frames. The -- // surface can be destroyed by the time the host receives a request to destroy -- // a buffer, and is able to call the OnSubmission for that specific buffer. -- if (surface) { -- // As long as mojo calls rerouted to the IO child thread, we have to reroute -- // them back to the same thread, where the original commit buffer call came -- // from. -- commit_thread_runner_->PostTask( -- FROM_HERE, -- base::Bind(&WaylandSurfaceGpu::OnSubmission, base::Unretained(surface), -- buffer_id, swap_result)); -- } -+ auto surface = GetSurface(widget); -+ // As long as mojo calls rerouted to the IO child thread, we have to reroute -+ // them back to the same thread, where the original commit buffer call came -+ // from. -+ commit_thread_runner_->PostTask( -+ FROM_HERE, base::Bind(&WaylandSurfaceGpu::OnSubmission, surface, -+ buffer_id, swap_result)); - } - - void WaylandBufferManagerGpu::OnPresentation( -@@ -64,36 +58,35 @@ void WaylandBufferManagerGpu::OnPresentation( - const gfx::PresentationFeedback& feedback) { - DCHECK(io_thread_runner_->BelongsToCurrentThread()); - DCHECK_NE(widget, gfx::kNullAcceleratedWidget); -- auto* surface = GetSurface(widget); -- // There can be a race between destruction and presenting the last frames. The -- // surface can be destroyed by the time the host receives a request to destroy -- // a buffer, and is able to call the OnPresentation for that specific buffer. -- if (surface) { -- // As long as mojo calls rerouted to the IO child thread, we have to reroute -- // them back to the same thread, where the original commit buffer call came -- // from. -- commit_thread_runner_->PostTask( -- FROM_HERE, base::Bind(&WaylandSurfaceGpu::OnPresentation, -- base::Unretained(surface), buffer_id, feedback)); -- } --} -- --void WaylandBufferManagerGpu::RegisterSurface(gfx::AcceleratedWidget widget, -- WaylandSurfaceGpu* surface) { -+ auto surface = GetSurface(widget); -+ // As long as mojo calls rerouted to the IO child thread, we have to reroute -+ // them back to the same thread, where the original commit buffer call came -+ // from. -+ commit_thread_runner_->PostTask( -+ FROM_HERE, base::Bind(&WaylandSurfaceGpu::OnPresentation, surface, -+ buffer_id, feedback)); -+} -+ -+void WaylandBufferManagerGpu::RegisterSurface( -+ gfx::AcceleratedWidget widget, -+ base::WeakPtr<WaylandSurfaceGpu> surface) { -+ base::AutoLock scoped_lock(lock_); - widget_to_surface_map_.insert(std::make_pair(widget, surface)); - } - - void WaylandBufferManagerGpu::UnregisterSurface(gfx::AcceleratedWidget widget) { -+ base::AutoLock scoped_lock(lock_); - widget_to_surface_map_.erase(widget); - } - --WaylandSurfaceGpu* WaylandBufferManagerGpu::GetSurface( -- gfx::AcceleratedWidget widget) const { -- WaylandSurfaceGpu* surface = nullptr; -+base::WeakPtr<WaylandSurfaceGpu> WaylandBufferManagerGpu::GetSurface( -+ gfx::AcceleratedWidget widget) { -+ base::AutoLock scoped_lock(lock_); -+ - auto it = widget_to_surface_map_.find(widget); - if (it != widget_to_surface_map_.end()) -- surface = it->second; -- return surface; -+ return it->second; -+ return nullptr; - } - - void WaylandBufferManagerGpu::CreateDmabufBasedBuffer( -diff --git a/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h b/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h -index 87439610cfc3..631d715e719e 100644 ---- a/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h -+++ b/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h -@@ -8,6 +8,8 @@ - #include <memory> - - #include "base/macros.h" -+#include "base/memory/weak_ptr.h" -+#include "base/synchronization/lock.h" - #include "base/threading/sequenced_task_runner_handle.h" - #include "base/threading/thread_checker.h" - #include "mojo/public/cpp/bindings/associated_binding.h" -@@ -64,9 +66,11 @@ class WaylandBufferManagerGpu : public ozone::mojom::WaylandBufferManagerGpu { - // result of the below operations, they must register themselves with the - // below APIs. - void RegisterSurface(gfx::AcceleratedWidget widget, -- WaylandSurfaceGpu* surface); -+ base::WeakPtr<WaylandSurfaceGpu> surface); - void UnregisterSurface(gfx::AcceleratedWidget widget); -- WaylandSurfaceGpu* GetSurface(gfx::AcceleratedWidget widget) const; -+ // A client of this method must always get and acquire lock before doing -+ // any manipulations with the surface. Once done, the lock must be released. -+ base::WeakPtr<WaylandSurfaceGpu> GetSurface(gfx::AcceleratedWidget widget); - - // Methods, which can be used when in both in-process-gpu and out of process - // modes. These calls are forwarded to the browser process through the -@@ -156,7 +160,8 @@ class WaylandBufferManagerGpu : public ozone::mojom::WaylandBufferManagerGpu { - mojo::AssociatedBinding<ozone::mojom::WaylandBufferManagerGpu> - associated_binding_; - -- std::map<gfx::AcceleratedWidget, WaylandSurfaceGpu*> widget_to_surface_map_; -+ std::map<gfx::AcceleratedWidget, base::WeakPtr<WaylandSurfaceGpu>> -+ widget_to_surface_map_; // Guarded by |lock_|. - - // This task runner can be used to pass messages back to the same thread, - // where the commit buffer request came from. For example, swap requests come -@@ -171,6 +176,9 @@ class WaylandBufferManagerGpu : public ozone::mojom::WaylandBufferManagerGpu { - // needed to ensure mojo calls happen on a right sequence. - scoped_refptr<base::SingleThreadTaskRunner> io_thread_runner_; - -+ // Protects access to |widget_to_surface_map_|. -+ base::Lock lock_; -+ - DISALLOW_COPY_AND_ASSIGN(WaylandBufferManagerGpu); - }; - -diff --git a/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc b/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc -index 231d590296d9..d1e244e910c6 100644 ---- a/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc -+++ b/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc -@@ -147,7 +147,7 @@ WaylandCanvasSurface::WaylandCanvasSurface( - WaylandBufferManagerGpu* buffer_manager, - gfx::AcceleratedWidget widget) - : buffer_manager_(buffer_manager), widget_(widget) { -- buffer_manager_->RegisterSurface(widget_, this); -+ buffer_manager_->RegisterSurface(widget_, GetWeakPtr()); - } - - WaylandCanvasSurface::~WaylandCanvasSurface() { -diff --git a/ui/ozone/platform/wayland/gpu/wayland_surface_gpu.cc b/ui/ozone/platform/wayland/gpu/wayland_surface_gpu.cc -new file mode 100644 -index 000000000000..85296edcca42 ---- /dev/null -+++ b/ui/ozone/platform/wayland/gpu/wayland_surface_gpu.cc -@@ -0,0 +1,16 @@ -+// Copyright 2019 The Chromium Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style license that can be -+// found in the LICENSE file. -+ -+#include "ui/ozone/platform/wayland/gpu/wayland_surface_gpu.h" -+ -+namespace ui { -+ -+WaylandSurfaceGpu::WaylandSurfaceGpu() = default; -+WaylandSurfaceGpu::~WaylandSurfaceGpu() = default; -+ -+base::WeakPtr<WaylandSurfaceGpu> WaylandSurfaceGpu::GetWeakPtr() { -+ return weak_factory_.GetWeakPtr(); -+} -+ -+} // namespace ui -diff --git a/ui/ozone/platform/wayland/gpu/wayland_surface_gpu.h b/ui/ozone/platform/wayland/gpu/wayland_surface_gpu.h -index ace5279e838e..38d285317ab3 100644 ---- a/ui/ozone/platform/wayland/gpu/wayland_surface_gpu.h -+++ b/ui/ozone/platform/wayland/gpu/wayland_surface_gpu.h -@@ -8,6 +8,7 @@ - #include <memory> - - #include "base/macros.h" -+#include "base/memory/weak_ptr.h" - - namespace gfx { - enum class SwapResult; -@@ -22,7 +23,7 @@ namespace ui { - // the buffer. - class WaylandSurfaceGpu { - public: -- virtual ~WaylandSurfaceGpu() {} -+ virtual ~WaylandSurfaceGpu(); - - // Tells the surface the result of the last swap of buffer with the - // |buffer_id|. -@@ -33,6 +34,16 @@ class WaylandSurfaceGpu { - // |buffer_id|. - virtual void OnPresentation(uint32_t buffer_id, - const gfx::PresentationFeedback& feedback) = 0; -+ -+ protected: -+ WaylandSurfaceGpu(); -+ -+ base::WeakPtr<WaylandSurfaceGpu> GetWeakPtr(); -+ -+ private: -+ base::WeakPtrFactory<WaylandSurfaceGpu> weak_factory_{this}; -+ -+ DISALLOW_COPY_AND_ASSIGN(WaylandSurfaceGpu); - }; - - } // namespace ui --- -2.23.0 - |