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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.h" 5 #include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" 9 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
10 10
11 namespace content { 11 namespace content {
12 12
13 WebRtcMediaStreamTrackAdapterMap::AdapterEntry::AdapterEntry( 13 WebRtcMediaStreamTrackAdapterMap::AdapterEntry::AdapterEntry(
14 const scoped_refptr<WebRtcMediaStreamTrackAdapter>& adapter) 14 const scoped_refptr<WebRtcMediaStreamTrackAdapter>& adapter)
15 : adapter(adapter) {} 15 : adapter(adapter) {}
16 16
17 WebRtcMediaStreamTrackAdapterMap::AdapterEntry::AdapterEntry( 17 WebRtcMediaStreamTrackAdapterMap::AdapterEntry::AdapterEntry(
18 AdapterEntry&& other) 18 AdapterEntry&& other)
19 : adapter(other.adapter) { 19 : adapter(other.adapter) {
20 other.adapter = nullptr; 20 other.adapter = nullptr;
21 } 21 }
22 22
23 WebRtcMediaStreamTrackAdapterMap::AdapterEntry::~AdapterEntry() { 23 WebRtcMediaStreamTrackAdapterMap::AdapterEntry::~AdapterEntry() {
24 DCHECK(!adapter || !adapter->is_initialized());
25 } 24 }
26 25
27 WebRtcMediaStreamTrackAdapterMap::AdapterRef::AdapterRef( 26 WebRtcMediaStreamTrackAdapterMap::AdapterRef::AdapterRef(
28 const scoped_refptr<WebRtcMediaStreamTrackAdapterMap>& map, 27 const scoped_refptr<WebRtcMediaStreamTrackAdapterMap>& map,
29 Type type, 28 Type type,
30 const MapEntryIterator& it) 29 const MapEntryIterator& it)
31 : map_(map), type_(type), it_(it), adapter_(entry()->adapter) { 30 : map_(map), type_(type), it_(it), adapter_(entry()->adapter) {
32 DCHECK(map_); 31 DCHECK(map_);
33 DCHECK(adapter_); 32 DCHECK(adapter_);
34 } 33 }
35 34
36 WebRtcMediaStreamTrackAdapterMap::AdapterRef::~AdapterRef() { 35 WebRtcMediaStreamTrackAdapterMap::AdapterRef::~AdapterRef() {
37 DCHECK(map_->main_thread_->BelongsToCurrentThread()); 36 DCHECK(map_->main_thread_->BelongsToCurrentThread());
38 base::AutoLock scoped_lock(map_->lock_); 37 scoped_refptr<WebRtcMediaStreamTrackAdapter> removed_adapter;
39 adapter_ = nullptr; 38 {
40 if (entry()->adapter->HasOneRef()) { 39 base::AutoLock scoped_lock(map_->lock_);
41 entry()->adapter->Dispose(); 40 adapter_ = nullptr;
42 if (type_ == Type::kLocal) 41 if (entry()->adapter->HasOneRef()) {
43 map_->local_track_adapters_.erase(it_); 42 removed_adapter = entry()->adapter;
44 else 43 if (type_ == Type::kLocal)
45 map_->remote_track_adapters_.erase(it_); 44 map_->local_track_adapters_.erase(it_);
45 else
46 map_->remote_track_adapters_.erase(it_);
47 }
48 }
49 // Dispose the adapter if it was removed. This is performed after releasing
50 // the lock so that it is safe for any disposal mechanism to do synchronous
51 // invokes to the signaling thread without any risk of deadlock.
52 if (removed_adapter) {
53 removed_adapter->Dispose();
46 } 54 }
47 } 55 }
48 56
49 WebRtcMediaStreamTrackAdapterMap::WebRtcMediaStreamTrackAdapterMap( 57 WebRtcMediaStreamTrackAdapterMap::WebRtcMediaStreamTrackAdapterMap(
50 PeerConnectionDependencyFactory* const factory) 58 PeerConnectionDependencyFactory* const factory)
51 : factory_(factory), main_thread_(base::ThreadTaskRunnerHandle::Get()) { 59 : factory_(factory), main_thread_(base::ThreadTaskRunnerHandle::Get()) {
52 DCHECK(factory_); 60 DCHECK(factory_);
53 DCHECK(main_thread_); 61 DCHECK(main_thread_);
54 } 62 }
55 63
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 if (it == track_adapters->end()) { 138 if (it == track_adapters->end()) {
131 scoped_refptr<WebRtcMediaStreamTrackAdapter> adapter = 139 scoped_refptr<WebRtcMediaStreamTrackAdapter> adapter =
132 create_adapter_callback.Run(); 140 create_adapter_callback.Run();
133 it = 141 it =
134 track_adapters->insert(std::make_pair(id, AdapterEntry(adapter))).first; 142 track_adapters->insert(std::make_pair(id, AdapterEntry(adapter))).first;
135 } 143 }
136 return base::WrapUnique(new AdapterRef(this, type, it)); 144 return base::WrapUnique(new AdapterRef(this, type, it));
137 } 145 }
138 146
139 } // namespace content 147 } // namespace content
OLDNEW
« 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