| 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 |