Index: content/browser/renderer_host/render_widget_helper_mac.mm |
diff --git a/content/browser/renderer_host/render_widget_helper_mac.mm b/content/browser/renderer_host/render_widget_helper_mac.mm |
index f0d94f43f387ece29c2c2d621016f25bfcaf2bf7..a1ce25cedf334128e5833af641856c3ca06e8c96 100644 |
--- a/content/browser/renderer_host/render_widget_helper_mac.mm |
+++ b/content/browser/renderer_host/render_widget_helper_mac.mm |
@@ -21,7 +21,12 @@ namespace content { |
namespace { |
typedef std::map<gfx::AcceleratedWidget,std::pair<int,int>> WidgetMap; |
base::LazyInstance<WidgetMap> g_widget_map; |
-base::LazyInstance<base::Lock> g_lock; |
+base::LazyInstance<base::Lock> g_widget_map_lock; |
+ |
+typedef std::set<uint64> TokenSet; |
+base::LazyInstance<TokenSet> g_token_set; |
+uint64 g_token_last_issued = 0; |
+base::LazyInstance<base::Lock> g_token_set_lock; |
} // namespace |
// static |
@@ -29,7 +34,7 @@ void RenderWidgetHelper::SetRenderWidgetIDForWidget( |
gfx::AcceleratedWidget native_widget, |
int render_process_id, |
int render_widget_id) { |
- base::AutoLock lock(g_lock.Get()); |
+ base::AutoLock lock(g_widget_map_lock.Get()); |
g_widget_map.Get()[native_widget] = std::make_pair( |
render_process_id, render_widget_id); |
} |
@@ -37,7 +42,7 @@ void RenderWidgetHelper::SetRenderWidgetIDForWidget( |
// static |
void RenderWidgetHelper::ResetRenderWidgetIDForWidget( |
gfx::AcceleratedWidget native_widget) { |
- base::AutoLock lock(g_lock.Get()); |
+ base::AutoLock lock(g_widget_map_lock.Get()); |
g_widget_map.Get().erase(native_widget); |
} |
@@ -46,7 +51,7 @@ bool RenderWidgetHelper::GetRenderWidgetIDForWidget( |
gfx::AcceleratedWidget native_widget, |
int* render_process_id, |
int* render_widget_id) { |
- base::AutoLock lock(g_lock.Get()); |
+ base::AutoLock lock(g_widget_map_lock.Get()); |
auto found = g_widget_map.Get().find(native_widget); |
if (found != g_widget_map.Get().end()) { |
@@ -60,9 +65,24 @@ bool RenderWidgetHelper::GetRenderWidgetIDForWidget( |
return false; |
} |
+uint64 RenderWidgetHelper::CreateNativeWidgetSwapToken() { |
+ base::AutoLock lock(g_token_set_lock.Get()); |
+ g_token_last_issued += 1; |
+ g_token_set.Get().insert(g_token_last_issued); |
+ return g_token_last_issued; |
+} |
+ |
// static |
void RenderWidgetHelper::OnNativeSurfaceBuffersSwappedOnUIThread( |
const ViewHostMsg_CompositorSurfaceBuffersSwapped_Params& params) { |
+ { |
+ base::AutoLock lock(g_token_set_lock.Get()); |
+ auto found = g_token_set.Get().find(params.native_widget_token); |
+ if (found == g_token_set.Get().end()) |
+ return; |
+ g_token_set.Get().erase(found); |
+ } |
+ |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
gfx::AcceleratedWidget native_widget = |
content::GpuSurfaceTracker::Get()->AcquireNativeWidget(params.surface_id); |