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

Side by Side Diff: chrome/browser/media/router/discovery/mdns/dns_sd_registry.cc

Issue 2874243003: [mDns] Make DnsSdRegistry a leaky singleton (Closed)
Patch Set: resolve code review comments from Mark Created 3 years, 7 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "chrome/browser/media/router/discovery/mdns/dns_sd_registry.h" 5 #include "chrome/browser/media/router/discovery/mdns/dns_sd_registry.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 DnsSdRegistry::DnsSdRegistry() { 108 DnsSdRegistry::DnsSdRegistry() {
109 #if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) 109 #if BUILDFLAG(ENABLE_SERVICE_DISCOVERY)
110 service_discovery_client_ = ServiceDiscoverySharedClient::GetInstance(); 110 service_discovery_client_ = ServiceDiscoverySharedClient::GetInstance();
111 #endif 111 #endif
112 } 112 }
113 113
114 DnsSdRegistry::DnsSdRegistry(ServiceDiscoverySharedClient* client) { 114 DnsSdRegistry::DnsSdRegistry(ServiceDiscoverySharedClient* client) {
115 service_discovery_client_ = client; 115 service_discovery_client_ = client;
116 } 116 }
117 117
118 DnsSdRegistry::~DnsSdRegistry() {} 118 DnsSdRegistry::~DnsSdRegistry() {
119 DCHECK(thread_checker_.CalledOnValidThread());
120 }
121
122 // static
123 DnsSdRegistry* DnsSdRegistry::GetInstance() {
124 return base::Singleton<DnsSdRegistry,
125 base::LeakySingletonTraits<DnsSdRegistry>>::get();
126 }
119 127
120 void DnsSdRegistry::AddObserver(DnsSdObserver* observer) { 128 void DnsSdRegistry::AddObserver(DnsSdObserver* observer) {
129 DCHECK(thread_checker_.CalledOnValidThread());
121 observers_.AddObserver(observer); 130 observers_.AddObserver(observer);
122 } 131 }
123 132
124 void DnsSdRegistry::RemoveObserver(DnsSdObserver* observer) { 133 void DnsSdRegistry::RemoveObserver(DnsSdObserver* observer) {
134 DCHECK(thread_checker_.CalledOnValidThread());
125 observers_.RemoveObserver(observer); 135 observers_.RemoveObserver(observer);
126 } 136 }
127 137
128 DnsSdDeviceLister* DnsSdRegistry::CreateDnsSdDeviceLister( 138 DnsSdDeviceLister* DnsSdRegistry::CreateDnsSdDeviceLister(
129 DnsSdDelegate* delegate, 139 DnsSdDelegate* delegate,
130 const std::string& service_type, 140 const std::string& service_type,
131 local_discovery::ServiceDiscoverySharedClient* discovery_client) { 141 local_discovery::ServiceDiscoverySharedClient* discovery_client) {
132 return new DnsSdDeviceLister(discovery_client, delegate, service_type); 142 return new DnsSdDeviceLister(discovery_client, delegate, service_type);
133 } 143 }
134 144
135 void DnsSdRegistry::Publish(const std::string& service_type) { 145 void DnsSdRegistry::Publish(const std::string& service_type) {
146 DCHECK(thread_checker_.CalledOnValidThread());
136 DispatchApiEvent(service_type); 147 DispatchApiEvent(service_type);
137 } 148 }
138 149
139 void DnsSdRegistry::ForceDiscovery() { 150 void DnsSdRegistry::ForceDiscovery() {
151 DCHECK(thread_checker_.CalledOnValidThread());
140 for (const auto& next_service : service_data_map_) { 152 for (const auto& next_service : service_data_map_) {
141 next_service.second->ForceDiscovery(); 153 next_service.second->ForceDiscovery();
142 } 154 }
143 } 155 }
144 156
145 void DnsSdRegistry::RegisterDnsSdListener(const std::string& service_type) { 157 void DnsSdRegistry::RegisterDnsSdListener(const std::string& service_type) {
158 DCHECK(thread_checker_.CalledOnValidThread());
146 VLOG(1) << "RegisterDnsSdListener: " << service_type 159 VLOG(1) << "RegisterDnsSdListener: " << service_type
147 << ", registered: " << IsRegistered(service_type); 160 << ", registered: " << IsRegistered(service_type);
148 if (service_type.empty()) 161 if (service_type.empty())
149 return; 162 return;
150 163
151 if (IsRegistered(service_type)) { 164 if (IsRegistered(service_type)) {
152 service_data_map_[service_type]->ListenerAdded(); 165 service_data_map_[service_type]->ListenerAdded();
153 DispatchApiEvent(service_type); 166 DispatchApiEvent(service_type);
154 return; 167 return;
155 } 168 }
156 169
157 std::unique_ptr<DnsSdDeviceLister> dns_sd_device_lister( 170 std::unique_ptr<DnsSdDeviceLister> dns_sd_device_lister(
158 CreateDnsSdDeviceLister(this, service_type, 171 CreateDnsSdDeviceLister(this, service_type,
159 service_discovery_client_.get())); 172 service_discovery_client_.get()));
160 dns_sd_device_lister->Discover(false); 173 dns_sd_device_lister->Discover(false);
161 service_data_map_[service_type] = 174 service_data_map_[service_type] =
162 base::MakeUnique<ServiceTypeData>(std::move(dns_sd_device_lister)); 175 base::MakeUnique<ServiceTypeData>(std::move(dns_sd_device_lister));
163 DispatchApiEvent(service_type); 176 DispatchApiEvent(service_type);
164 } 177 }
165 178
166 void DnsSdRegistry::UnregisterDnsSdListener(const std::string& service_type) { 179 void DnsSdRegistry::UnregisterDnsSdListener(const std::string& service_type) {
180 DCHECK(thread_checker_.CalledOnValidThread());
167 VLOG(1) << "UnregisterDnsSdListener: " << service_type; 181 VLOG(1) << "UnregisterDnsSdListener: " << service_type;
168 auto it = service_data_map_.find(service_type); 182 auto it = service_data_map_.find(service_type);
169 if (it == service_data_map_.end()) 183 if (it == service_data_map_.end())
170 return; 184 return;
171 185
172 if (service_data_map_[service_type]->ListenerRemoved()) 186 if (service_data_map_[service_type]->ListenerRemoved())
173 service_data_map_.erase(it); 187 service_data_map_.erase(it);
174 } 188 }
175 189
176 void DnsSdRegistry::ServiceChanged(const std::string& service_type, 190 void DnsSdRegistry::ServiceChanged(const std::string& service_type,
177 bool added, 191 bool added,
178 const DnsSdService& service) { 192 const DnsSdService& service) {
193 DCHECK(thread_checker_.CalledOnValidThread());
179 VLOG(1) << "ServiceChanged: service_type: " << service_type 194 VLOG(1) << "ServiceChanged: service_type: " << service_type
180 << ", known: " << IsRegistered(service_type) 195 << ", known: " << IsRegistered(service_type)
181 << ", service: " << service.service_name << ", added: " << added; 196 << ", service: " << service.service_name << ", added: " << added;
182 if (!IsRegistered(service_type)) { 197 if (!IsRegistered(service_type)) {
183 return; 198 return;
184 } 199 }
185 200
186 bool is_updated = 201 bool is_updated =
187 service_data_map_[service_type]->UpdateService(added, service); 202 service_data_map_[service_type]->UpdateService(added, service);
188 VLOG(1) << "ServiceChanged: is_updated: " << is_updated; 203 VLOG(1) << "ServiceChanged: is_updated: " << is_updated;
189 204
190 if (is_updated) { 205 if (is_updated) {
191 DispatchApiEvent(service_type); 206 DispatchApiEvent(service_type);
192 } 207 }
193 } 208 }
194 209
195 void DnsSdRegistry::ServiceRemoved(const std::string& service_type, 210 void DnsSdRegistry::ServiceRemoved(const std::string& service_type,
196 const std::string& service_name) { 211 const std::string& service_name) {
212 DCHECK(thread_checker_.CalledOnValidThread());
197 VLOG(1) << "ServiceRemoved: service_type: " << service_type 213 VLOG(1) << "ServiceRemoved: service_type: " << service_type
198 << ", known: " << IsRegistered(service_type) 214 << ", known: " << IsRegistered(service_type)
199 << ", service: " << service_name; 215 << ", service: " << service_name;
200 if (!IsRegistered(service_type)) { 216 if (!IsRegistered(service_type)) {
201 return; 217 return;
202 } 218 }
203 219
204 bool is_removed = 220 bool is_removed =
205 service_data_map_[service_type]->RemoveService(service_name); 221 service_data_map_[service_type]->RemoveService(service_name);
206 VLOG(1) << "ServiceRemoved: is_removed: " << is_removed; 222 VLOG(1) << "ServiceRemoved: is_removed: " << is_removed;
207 223
208 if (is_removed) 224 if (is_removed)
209 DispatchApiEvent(service_type); 225 DispatchApiEvent(service_type);
210 } 226 }
211 227
212 void DnsSdRegistry::ServicesFlushed(const std::string& service_type) { 228 void DnsSdRegistry::ServicesFlushed(const std::string& service_type) {
229 DCHECK(thread_checker_.CalledOnValidThread());
213 VLOG(1) << "ServicesFlushed: service_type: " << service_type 230 VLOG(1) << "ServicesFlushed: service_type: " << service_type
214 << ", known: " << IsRegistered(service_type); 231 << ", known: " << IsRegistered(service_type);
215 if (!IsRegistered(service_type)) { 232 if (!IsRegistered(service_type)) {
216 return; 233 return;
217 } 234 }
218 235
219 bool is_cleared = service_data_map_[service_type]->ClearServices(); 236 bool is_cleared = service_data_map_[service_type]->ClearServices();
220 VLOG(1) << "ServicesFlushed: is_cleared: " << is_cleared; 237 VLOG(1) << "ServicesFlushed: is_cleared: " << is_cleared;
221 238
222 if (is_cleared) 239 if (is_cleared)
223 DispatchApiEvent(service_type); 240 DispatchApiEvent(service_type);
224 } 241 }
225 242
226 void DnsSdRegistry::DispatchApiEvent(const std::string& service_type) { 243 void DnsSdRegistry::DispatchApiEvent(const std::string& service_type) {
244 DCHECK(thread_checker_.CalledOnValidThread());
227 VLOG(1) << "DispatchApiEvent: service_type: " << service_type; 245 VLOG(1) << "DispatchApiEvent: service_type: " << service_type;
228 for (auto& observer : observers_) { 246 for (auto& observer : observers_) {
229 observer.OnDnsSdEvent(service_type, 247 observer.OnDnsSdEvent(service_type,
230 service_data_map_[service_type]->GetServiceList()); 248 service_data_map_[service_type]->GetServiceList());
231 } 249 }
232 } 250 }
233 251
234 bool DnsSdRegistry::IsRegistered(const std::string& service_type) { 252 bool DnsSdRegistry::IsRegistered(const std::string& service_type) {
253 DCHECK(thread_checker_.CalledOnValidThread());
235 return service_data_map_.find(service_type) != service_data_map_.end(); 254 return service_data_map_.find(service_type) != service_data_map_.end();
236 } 255 }
237 256
238 } // namespace media_router 257 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698