Chromium Code Reviews| Index: content/renderer/media/video_frame_deliverer.cc |
| diff --git a/content/renderer/media/video_frame_deliverer.cc b/content/renderer/media/video_frame_deliverer.cc |
| index 67b11c42ecdc4482f8b23c733c6c1a48cb0e5703..c291d0a7f1b8ec827f95b4e3cdfcd879bc946831 100644 |
| --- a/content/renderer/media/video_frame_deliverer.cc |
| +++ b/content/renderer/media/video_frame_deliverer.cc |
| @@ -8,6 +8,11 @@ |
| #include "base/location.h" |
| namespace content { |
| +namespace { |
| +void ResetCallback(VideoCaptureDeliverFrameCB callback) { |
| + callback.Reset(); |
| +} |
| +} // namespace |
| VideoFrameDeliverer::VideoFrameDeliverer( |
| const scoped_refptr<base::MessageLoopProxy>& io_message_loop) |
| @@ -41,15 +46,18 @@ void VideoFrameDeliverer::RemoveCallback(void* id) { |
| io_message_loop_->PostTask( |
| FROM_HERE, |
| base::Bind(&VideoFrameDeliverer::RemoveCallbackOnIO, |
| - this, id)); |
| + this, id, base::MessageLoopProxy::current())); |
| } |
| -void VideoFrameDeliverer::RemoveCallbackOnIO(void* id) { |
| +void VideoFrameDeliverer::RemoveCallbackOnIO( |
| + void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop) { |
| DCHECK(io_message_loop_->BelongsToCurrentThread()); |
| std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin(); |
| for (; it != callbacks_.end(); ++it) { |
| if (it->first == id) { |
| + VideoCaptureDeliverFrameCB callback = it->second; |
| callbacks_.erase(it); |
| + message_loop->PostTask(FROM_HERE, base::Bind(&ResetCallback, callback)); |
|
piman
2014/05/09 03:44:23
So, this is racy.
If the target message loop is fr
|
| return; |
| } |
| } |