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

Side by Side Diff: ios/web/public/test/http_server.mm

Issue 2794933002: Relax DCHECKs regarding Threads and RefCounts in iOS' HttpServer. (Closed)
Patch Set: Fix broken ios_chrome_web_egtests. Created 3 years, 8 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 #import "ios/web/public/test/http_server.h" 5 #import "ios/web/public/test/http_server.h"
6 6
7 #import <Foundation/Foundation.h> 7 #import <Foundation/Foundation.h>
8 8
9 #include <string> 9 #include <string>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/memory/ref_counted.h"
12 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
13 #include "base/strings/sys_string_conversions.h" 14 #include "base/strings/sys_string_conversions.h"
14 #import "ios/third_party/gcdwebserver/src/GCDWebServer/Core/GCDWebServer.h" 15 #import "ios/third_party/gcdwebserver/src/GCDWebServer/Core/GCDWebServer.h"
15 #import "ios/third_party/gcdwebserver/src/GCDWebServer/Core/GCDWebServerResponse .h" 16 #import "ios/third_party/gcdwebserver/src/GCDWebServer/Core/GCDWebServerResponse .h"
16 #import "ios/third_party/gcdwebserver/src/GCDWebServer/Requests/GCDWebServerData Request.h" 17 #import "ios/third_party/gcdwebserver/src/GCDWebServer/Requests/GCDWebServerData Request.h"
17 #import "net/base/mac/url_conversions.h" 18 #import "net/base/mac/url_conversions.h"
18 19
19 #include "url/gurl.h" 20 #include "url/gurl.h"
20 21
21 namespace { 22 namespace {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 for (std::unique_ptr<ResponseProvider>& provider : response_providers) 74 for (std::unique_ptr<ResponseProvider>& provider : response_providers)
74 server.AddResponseProvider(std::move(provider)); 75 server.AddResponseProvider(std::move(provider));
75 return server; 76 return server;
76 } 77 }
77 78
78 void HttpServer::InitHttpServer() { 79 void HttpServer::InitHttpServer() {
79 DCHECK(gcd_web_server_); 80 DCHECK(gcd_web_server_);
80 // Note: This block is called from an arbitrary GCD thread. 81 // Note: This block is called from an arbitrary GCD thread.
81 id process_request = 82 id process_request =
82 ^GCDWebServerResponse*(GCDWebServerDataRequest* request) { 83 ^GCDWebServerResponse*(GCDWebServerDataRequest* request) {
84 // Relax the cross-thread access restriction to non-thread-safe RefCount.
85 // TODO(crbug.com/707010): Remove ScopedAllowCrossThreadRefCountAccess.
86 base::ScopedAllowCrossThreadRefCountAccess
87 allow_cross_thread_ref_count_access;
88
83 ResponseProvider::Request provider_request = 89 ResponseProvider::Request provider_request =
84 ResponseProviderRequestFromGCDWebServerRequest(request); 90 ResponseProviderRequestFromGCDWebServerRequest(request);
85 scoped_refptr<RefCountedResponseProviderWrapper> 91 scoped_refptr<RefCountedResponseProviderWrapper>
86 ref_counted_response_provider = GetResponseProviderForRequest( 92 ref_counted_response_provider = GetResponseProviderForRequest(
87 provider_request); 93 provider_request);
88 94
89 if (!ref_counted_response_provider) { 95 if (!ref_counted_response_provider) {
90 return [GCDWebServerResponse response]; 96 return [GCDWebServerResponse response];
91 } 97 }
92 ResponseProvider* response_provider = 98 ResponseProvider* response_provider =
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 const std::string new_path = std::string(result.host() + result.path()); 182 const std::string new_path = std::string(result.host() + result.path());
177 replacements.SetPathStr(new_path); 183 replacements.SetPathStr(new_path);
178 184
179 return result.ReplaceComponents(replacements); 185 return result.ReplaceComponents(replacements);
180 } 186 }
181 187
182 scoped_refptr<RefCountedResponseProviderWrapper> 188 scoped_refptr<RefCountedResponseProviderWrapper>
183 HttpServer::GetResponseProviderForRequest( 189 HttpServer::GetResponseProviderForRequest(
184 const web::ResponseProvider::Request& request) { 190 const web::ResponseProvider::Request& request) {
185 base::AutoLock autolock(provider_list_lock_); 191 base::AutoLock autolock(provider_list_lock_);
192 // Relax the cross-thread access restriction to non-thread-safe RefCount.
193 // The lock above protects non-thread-safe RefCount in HTTPServer.
194 base::ScopedAllowCrossThreadRefCountAccess
195 allow_cross_thread_ref_count_access;
186 scoped_refptr<RefCountedResponseProviderWrapper> result; 196 scoped_refptr<RefCountedResponseProviderWrapper> result;
187 for (const auto& ref_counted_response_provider : providers_) { 197 for (const auto& ref_counted_response_provider : providers_) {
188 ResponseProvider* response_provider = 198 ResponseProvider* response_provider =
189 ref_counted_response_provider.get()->GetResponseProvider(); 199 ref_counted_response_provider.get()->GetResponseProvider();
190 if (response_provider->CanHandleRequest(request)) { 200 if (response_provider->CanHandleRequest(request)) {
191 DCHECK(!result) << 201 DCHECK(!result) <<
192 "No more than one response provider can handle the same request."; 202 "No more than one response provider can handle the same request.";
193 result = ref_counted_response_provider; 203 result = ref_counted_response_provider;
194 } 204 }
195 } 205 }
196 return result; 206 return result;
197 } 207 }
198 208
199 void HttpServer::AddResponseProvider( 209 void HttpServer::AddResponseProvider(
200 std::unique_ptr<ResponseProvider> response_provider) { 210 std::unique_ptr<ResponseProvider> response_provider) {
201 DCHECK([NSThread isMainThread]); 211 DCHECK([NSThread isMainThread]);
202 DCHECK(IsRunning()) << "Can add a response provider only when the server is " 212 DCHECK(IsRunning()) << "Can add a response provider only when the server is "
203 << "running."; 213 << "running.";
204 base::AutoLock autolock(provider_list_lock_); 214 base::AutoLock autolock(provider_list_lock_);
215 // Relax the cross-thread access restriction to non-thread-safe RefCount.
216 // The lock above protects non-thread-safe RefCount in HTTPServer.
217 base::ScopedAllowCrossThreadRefCountAccess
218 allow_cross_thread_ref_count_access;
205 scoped_refptr<RefCountedResponseProviderWrapper> 219 scoped_refptr<RefCountedResponseProviderWrapper>
206 ref_counted_response_provider( 220 ref_counted_response_provider(
207 new RefCountedResponseProviderWrapper(std::move(response_provider))); 221 new RefCountedResponseProviderWrapper(std::move(response_provider)));
208 providers_.push_back(ref_counted_response_provider); 222 providers_.push_back(ref_counted_response_provider);
209 } 223 }
210 224
211 void HttpServer::RemoveResponseProvider(ResponseProvider* response_provider) { 225 void HttpServer::RemoveResponseProvider(ResponseProvider* response_provider) {
212 DCHECK([NSThread isMainThread]); 226 DCHECK([NSThread isMainThread]);
213 base::AutoLock autolock(provider_list_lock_); 227 base::AutoLock autolock(provider_list_lock_);
228 // Relax the cross-thread access restriction to non-thread-safe RefCount.
229 // The lock above protects non-thread-safe RefCount in HTTPServer.
230 base::ScopedAllowCrossThreadRefCountAccess
231 allow_cross_thread_ref_count_access;
214 auto found_iter = providers_.end(); 232 auto found_iter = providers_.end();
215 for (auto it = providers_.begin(); it != providers_.end(); ++it) { 233 for (auto it = providers_.begin(); it != providers_.end(); ++it) {
216 if ((*it)->GetResponseProvider() == response_provider) { 234 if ((*it)->GetResponseProvider() == response_provider) {
217 found_iter = it; 235 found_iter = it;
218 break; 236 break;
219 } 237 }
220 } 238 }
221 if (found_iter != providers_.end()) { 239 if (found_iter != providers_.end()) {
222 providers_.erase(found_iter); 240 providers_.erase(found_iter);
223 } 241 }
224 } 242 }
225 243
226 void HttpServer::RemoveAllResponseProviders() { 244 void HttpServer::RemoveAllResponseProviders() {
227 DCHECK([NSThread isMainThread]); 245 DCHECK([NSThread isMainThread]);
228 base::AutoLock autolock(provider_list_lock_); 246 base::AutoLock autolock(provider_list_lock_);
247 // Relax the cross-thread access restriction to non-thread-safe RefCount.
248 // The lock above protects non-thread-safe RefCount in HTTPServer.
249 base::ScopedAllowCrossThreadRefCountAccess
250 allow_cross_thread_ref_count_access;
229 providers_.clear(); 251 providers_.clear();
230 } 252 }
231 253
232 void HttpServer::SetPort(NSUInteger port) { 254 void HttpServer::SetPort(NSUInteger port) {
233 base::AutoLock autolock(port_lock_); 255 base::AutoLock autolock(port_lock_);
234 port_ = port; 256 port_ = port;
235 } 257 }
236 258
237 } // namespace test 259 } // namespace test
238 } // namespace web 260 } // namespace web
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