Chromium Code Reviews| Index: components/exo/compositor_frame_sink_holder.cc |
| diff --git a/components/exo/compositor_frame_sink_holder.cc b/components/exo/compositor_frame_sink_holder.cc |
| index dd82aff4dc1dc915afc79434ccbb091dc0c6d476..aef99e6f759de4d909e2fb891bed1f0bd22a07b2 100644 |
| --- a/components/exo/compositor_frame_sink_holder.cc |
| +++ b/components/exo/compositor_frame_sink_holder.cc |
| @@ -9,6 +9,14 @@ |
| namespace exo { |
| +namespace { |
| +void RunSingleReleaseCallback(cc::SingleReleaseCallback* callback, |
|
reveman
2016/12/20 16:34:28
Can you bind cc::SingleReleaseCallback::Run direct
Alex Z.
2016/12/20 17:54:01
This wrapper is now needed for holding a reference
|
| + const gpu::SyncToken& sync_token, |
| + bool is_lost) { |
| + callback->Run(sync_token, is_lost); |
| +} |
| +} // namespace |
| + |
| //////////////////////////////////////////////////////////////////////////////// |
| // CompositorFrameSinkHolder, public: |
| @@ -80,13 +88,16 @@ void CompositorFrameSinkHolder::OnBeginFrame(const cc::BeginFrameArgs& args) { |
| void CompositorFrameSinkHolder::ReclaimResources( |
| const cc::ReturnedResourceArray& resources) { |
| + scoped_refptr<CompositorFrameSinkHolder> compositor_frame_sink_holder; |
|
reveman
2016/12/20 16:34:28
This shouldn't be needed anymore, right?
Alex Z.
2016/12/20 17:54:01
CompositorFrameSinkHolder still gets destroyed too
|
| for (auto& resource : resources) { |
| auto it = release_callbacks_.find(resource.id); |
| DCHECK(it != release_callbacks_.end()); |
| - std::unique_ptr<cc::SingleReleaseCallback> callback = |
| - std::move(it->second.second); |
| + compositor_frame_sink_holder = std::move(it->second.first); |
| + auto closure = |
|
reveman
2016/12/20 16:34:28
nit: no need for this temporary variable. pass the
Alex Z.
2016/12/20 17:54:01
Done.
|
| + base::Bind(&RunSingleReleaseCallback, it->second.second.get(), |
|
reveman
2016/12/20 16:34:28
it->second.second.get() shouldn't work. The callba
|
| + resource.sync_token, resource.lost); |
| + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, closure); |
|
reveman
2016/12/20 16:34:28
What if the message loop is shutdown before this g
Alex Z.
2016/12/20 17:54:01
It seems no matter how we invoke the Callback::Run
|
| release_callbacks_.erase(it); |
| - callback->Run(resource.sync_token, resource.lost); |
| } |
| } |