Index: ui/ozone/platform/drm/gpu/drm_surface.cc |
diff --git a/ui/ozone/platform/drm/gpu/drm_surface.cc b/ui/ozone/platform/drm/gpu/drm_surface.cc |
index f55c925d34780cdcbe077a85fb28aa296c4d1a9a..dc9fbf53a8c124cc450ddfaba267c17ae4206ef3 100644 |
--- a/ui/ozone/platform/drm/gpu/drm_surface.cc |
+++ b/ui/ozone/platform/drm/gpu/drm_surface.cc |
@@ -99,9 +99,14 @@ void DrmSurface::SchedulePageFlip() { |
// Update our front buffer pointer. |
std::swap(front_buffer_, back_buffer_); |
- pending_pageflip_ = window_->SchedulePageFlip( |
- false /* is_sync */, |
- base::Bind(&DrmSurface::OnPageFlip, weak_ptr_factory_.GetWeakPtr())); |
+ // First set the pending flag otherwise there could be a re-entrancy issue if |
+ // the callback is executed synchronously. |
+ pending_pageflip_ = true; |
+ if (!window_->SchedulePageFlip(false /* is_sync */, |
+ base::Bind(&DrmSurface::OnPageFlip, |
+ weak_ptr_factory_.GetWeakPtr()))) { |
+ pending_pageflip_ = false; |
+ } |
} |
void DrmSurface::OnPageFlip(gfx::SwapResult result) { |