Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(231)

Unified Diff: content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.cc

Issue 2958723003: Fix deadlock in WebRtcMediaStreamTrackAdapterMap. (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
}
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698