| Index: content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.cc
|
| diff --git a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.cc b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.cc
|
| index 685e576b1006fc8cbff0ba1c0bd53463dfe7b40d..52a14eafdeffbde7d5ac8c1497361282ffa46b53 100644
|
| --- a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.cc
|
| +++ b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.cc
|
| @@ -21,7 +21,6 @@ WebRtcMediaStreamTrackAdapterMap::AdapterEntry::AdapterEntry(
|
| }
|
|
|
| WebRtcMediaStreamTrackAdapterMap::AdapterEntry::~AdapterEntry() {
|
| - DCHECK(!adapter || !adapter->is_initialized());
|
| }
|
|
|
| WebRtcMediaStreamTrackAdapterMap::AdapterRef::AdapterRef(
|
| @@ -35,14 +34,23 @@ WebRtcMediaStreamTrackAdapterMap::AdapterRef::AdapterRef(
|
|
|
| WebRtcMediaStreamTrackAdapterMap::AdapterRef::~AdapterRef() {
|
| DCHECK(map_->main_thread_->BelongsToCurrentThread());
|
| - base::AutoLock scoped_lock(map_->lock_);
|
| - adapter_ = nullptr;
|
| - if (entry()->adapter->HasOneRef()) {
|
| - entry()->adapter->Dispose();
|
| - if (type_ == Type::kLocal)
|
| - map_->local_track_adapters_.erase(it_);
|
| - else
|
| - map_->remote_track_adapters_.erase(it_);
|
| + scoped_refptr<WebRtcMediaStreamTrackAdapter> removed_adapter;
|
| + {
|
| + base::AutoLock scoped_lock(map_->lock_);
|
| + adapter_ = nullptr;
|
| + if (entry()->adapter->HasOneRef()) {
|
| + removed_adapter = entry()->adapter;
|
| + if (type_ == Type::kLocal)
|
| + map_->local_track_adapters_.erase(it_);
|
| + else
|
| + map_->remote_track_adapters_.erase(it_);
|
| + }
|
| + }
|
| + // Dispose the adapter if it was removed. This is performed after releasing
|
| + // the lock so that it is safe for any disposal mechanism to do synchronous
|
| + // invokes to the signaling thread without any risk of deadlock.
|
| + if (removed_adapter) {
|
| + removed_adapter->Dispose();
|
| }
|
| }
|
|
|
|
|