OLD | NEW |
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 Loading... |
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 |
OLD | NEW |