Changeset 137783 in webkit
- Timestamp:
- Dec 14, 2012, 3:33:45 PM (14 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 5 edited
-
ChangeLog (modified) (1 diff)
-
NetworkProcess/NetworkConnectionToWebProcess.cpp (modified) (1 diff)
-
NetworkProcess/NetworkConnectionToWebProcess.h (modified) (3 diffs)
-
NetworkProcess/NetworkResourceLoader.cpp (modified) (7 diffs)
-
Shared/BlockingResponseMap.h (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r137768 r137783 1 2012-12-14 Alexey Proskuryakov <ap@apple.com> 2 3 <rdar://problem/12874760> NetworkProcess loads may get stuck when WebProcess quits 4 https://bugs.webkit.org/show_bug.cgi?id=105056 5 6 Reviewed by Anders Carlsson. 7 8 Make response maps per-connection. 9 10 * NetworkProcess/NetworkConnectionToWebProcess.cpp: 11 (WebKit::NetworkConnectionToWebProcess::didClose): Cancel waiting for responses 12 from WebProcess, they will never arrive. 13 14 * NetworkProcess/NetworkConnectionToWebProcess.h: 15 (WebKit::NetworkConnectionToWebProcess::willSendRequestResponseMap): 16 (WebKit::NetworkConnectionToWebProcess::canAuthenticateAgainstProtectionSpaceResponseMap): 17 Maps now live here. 18 19 * NetworkProcess/NetworkResourceLoader.cpp: 20 (WebKit::NetworkResourceLoader::connectionToWebProcessDidClose): Added a FIXME. 21 22 (WebKit::NetworkResourceLoader::willSendRequest): 23 (WebKit::NetworkResourceLoader::willSendRequestHandled): 24 (WebKit::NetworkResourceLoader::canAuthenticateAgainstProtectionSpace): 25 (WebKit::NetworkResourceLoader::canAuthenticateAgainstProtectionSpaceHandled): 26 Handle the cases where we can't send a request, or can't expect a response any more. 27 28 * Shared/BlockingResponseMap.h: 29 (BlockingResponseMap): 30 (BlockingResponseMap::BlockingResponseMap): 31 (BlockingResponseMap::~BlockingResponseMap): 32 (BlockingResponseMap::waitForResponse): 33 (BlockingResponseMap::didReceiveResponse): 34 (BlockingResponseMap::cancel): 35 (BlockingBoolResponseMap): 36 (BlockingBoolResponseMap::BlockingBoolResponseMap): 37 (BlockingBoolResponseMap::~BlockingBoolResponseMap): 38 (BlockingBoolResponseMap::waitForResponse): 39 (BlockingBoolResponseMap::didReceiveResponse): 40 (BlockingBoolResponseMap::cancel): 41 Added an ability to cancel, and slightly beefed up overall. 42 1 43 2012-12-14 Anders Carlsson <andersca@apple.com> 2 44 -
trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp
r137657 r137783 103 103 104 104 NetworkProcess::shared().removeNetworkConnectionToWebProcess(this); 105 106 // FIXME (NetworkProcess): We might consider actively clearing out all requests for this connection. 107 // But that might not be necessary as the observer mechanism used above is much more direct. 105 106 // Unblock waiting threads. 107 m_willSendRequestResponseMap.cancel(); 108 m_canAuthenticateAgainstProtectionSpaceResponseMap.cancel(); 108 109 109 110 Vector<NetworkConnectionToWebProcessObserver*> observers; -
trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h
r137647 r137783 29 29 #if ENABLE(NETWORK_PROCESS) 30 30 31 #include "BlockingResponseMap.h" 31 32 #include "Connection.h" 32 33 #include "NetworkConnectionToWebProcessMessages.h" … … 61 62 62 63 bool isSerialLoadingEnabled() const { return m_serialLoadingEnabled; } 64 65 BlockingResponseMap<WebCore::ResourceRequest*>& willSendRequestResponseMap() { return m_willSendRequestResponseMap; } 66 BlockingBoolResponseMap& canAuthenticateAgainstProtectionSpaceResponseMap() { return m_canAuthenticateAgainstProtectionSpaceResponseMap; } 63 67 64 68 private: … … 96 100 97 101 HashSet<NetworkConnectionToWebProcessObserver*> m_observers; 98 102 103 BlockingResponseMap<WebCore::ResourceRequest*> m_willSendRequestResponseMap; 104 BlockingBoolResponseMap m_canAuthenticateAgainstProtectionSpaceResponseMap; 105 99 106 bool m_serialLoadingEnabled; 100 107 }; -
trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp
r137610 r137783 29 29 #if ENABLE(NETWORK_PROCESS) 30 30 31 #include "BlockingResponseMap.h"32 31 #include "DataReference.h" 33 32 #include "Logging.h" … … 145 144 { 146 145 ASSERT_ARG(connection, connection == m_connection.get()); 146 // FIXME (NetworkProcess): Cancel the load. The request may be long-living, so we don't want it to linger around after all clients are gone. 147 147 } 148 148 … … 178 178 } 179 179 180 static BlockingResponseMap<ResourceRequest*>& willSendRequestResponseMap()181 {182 AtomicallyInitializedStatic(BlockingResponseMap<ResourceRequest*>&, responseMap = *new BlockingResponseMap<ResourceRequest*>);183 return responseMap;184 }185 186 180 static uint64_t generateWillSendRequestID() 187 181 { … … 192 186 void NetworkResourceLoader::willSendRequest(ResourceHandle*, ResourceRequest& request, const ResourceResponse& redirectResponse) 193 187 { 194 // We only expect to get the willSendRequest callback from ResourceHandle as the result of a redirect 188 // We only expect to get the willSendRequest callback from ResourceHandle as the result of a redirect. 195 189 ASSERT(!redirectResponse.isNull()); 196 190 197 191 uint64_t requestID = generateWillSendRequestID(); 198 192 199 send(Messages::WebResourceLoader::WillSendRequest(requestID, request, redirectResponse)); 200 201 OwnPtr<ResourceRequest> newRequest = willSendRequestResponseMap().waitForResponse(requestID); 202 request = *newRequest; 193 if (!send(Messages::WebResourceLoader::WillSendRequest(requestID, request, redirectResponse))) { 194 request = ResourceRequest(); 195 return; 196 } 197 198 OwnPtr<ResourceRequest> newRequest = m_connection->willSendRequestResponseMap().waitForResponse(requestID); 199 request = newRequest ? *newRequest : ResourceRequest(); 203 200 204 201 RunLoop::main()->dispatch(WTF::bind(&NetworkResourceLoadScheduler::receivedRedirect, &NetworkProcess::shared().networkResourceLoadScheduler(), m_identifier, request.url())); … … 207 204 void NetworkResourceLoader::willSendRequestHandled(uint64_t requestID, const WebCore::ResourceRequest& newRequest) 208 205 { 209 willSendRequestResponseMap().didReceiveResponse(requestID, adoptPtr(new ResourceRequest(newRequest)));206 m_connection->willSendRequestResponseMap().didReceiveResponse(requestID, adoptPtr(new ResourceRequest(newRequest))); 210 207 } 211 208 … … 301 298 302 299 #if USE(PROTECTION_SPACE_AUTH_CALLBACK) 303 static BlockingBoolResponseMap& canAuthenticateAgainstProtectionSpaceResponseMap()304 {305 AtomicallyInitializedStatic(BlockingBoolResponseMap&, responseMap = *new BlockingBoolResponseMap);306 return responseMap;307 }308 309 300 static uint64_t generateCanAuthenticateAgainstProtectionSpaceID() 310 301 { … … 317 308 uint64_t requestID = generateCanAuthenticateAgainstProtectionSpaceID(); 318 309 319 send(Messages::WebResourceLoader::CanAuthenticateAgainstProtectionSpace(requestID, protectionSpace)); 320 321 return canAuthenticateAgainstProtectionSpaceResponseMap().waitForResponse(requestID); 310 if (!send(Messages::WebResourceLoader::CanAuthenticateAgainstProtectionSpace(requestID, protectionSpace))) 311 return false; 312 313 return m_connection->canAuthenticateAgainstProtectionSpaceResponseMap().waitForResponse(requestID); 322 314 } 323 315 324 316 void NetworkResourceLoader::canAuthenticateAgainstProtectionSpaceHandled(uint64_t requestID, bool canAuthenticate) 325 317 { 326 canAuthenticateAgainstProtectionSpaceResponseMap().didReceiveResponse(requestID, canAuthenticate);318 m_connection->canAuthenticateAgainstProtectionSpaceResponseMap().didReceiveResponse(requestID, canAuthenticate); 327 319 } 328 320 #endif -
trunk/Source/WebKit2/Shared/BlockingResponseMap.h
r137766 r137783 34 34 template<typename T> 35 35 class BlockingResponseMap { 36 WTF_MAKE_NONCOPYABLE(BlockingResponseMap); 36 37 public: 38 BlockingResponseMap() : m_canceled(false) { } 39 ~BlockingResponseMap() { ASSERT(m_responses.isEmpty()); } 40 37 41 PassOwnPtr<T> waitForResponse(uint64_t requestID) 38 42 { 39 43 while (true) { 40 44 MutexLocker locker(m_mutex); 45 46 if (m_canceled) 47 return nullptr; 41 48 42 49 if (OwnPtr<T> response = m_responses.take(requestID)) … … 55 62 56 63 m_responses.set(requestID, response); 57 // FIXME (NetworkProcess): Waking up all threads is quite inefficient. 64 // FIXME (NetworkProcess): <rdar://problem/12886430>: Waking up all threads is quite inefficient. 65 m_condition.broadcast(); 66 } 67 68 void cancel() 69 { 70 m_canceled = true; 71 72 // FIXME (NetworkProcess): <rdar://problem/12886430>: Waking up all threads is quite inefficient. 58 73 m_condition.broadcast(); 59 74 } … … 64 79 65 80 HashMap<uint64_t, OwnPtr<T> > m_responses; 81 bool m_canceled; 66 82 }; 67 83 68 84 class BlockingBoolResponseMap { 85 WTF_MAKE_NONCOPYABLE(BlockingBoolResponseMap); 69 86 public: 87 BlockingBoolResponseMap() : m_canceled(false) { } 88 ~BlockingBoolResponseMap() { ASSERT(m_responses.isEmpty()); } 89 70 90 bool waitForResponse(uint64_t requestID) 71 91 { 72 92 while (true) { 73 93 MutexLocker locker(m_mutex); 94 95 // FIXME: Differentiate between canceled wait and a negative response. 96 if (m_canceled) 97 return false; 74 98 75 99 HashMap<uint64_t, bool>::iterator iter = m_responses.find(requestID); … … 92 116 93 117 m_responses.set(requestID, response); 94 // FIXME (NetworkProcess): Waking up all threads is quite inefficient. 118 // FIXME (NetworkProcess): <rdar://problem/12886430>: Waking up all threads is quite inefficient. 119 m_condition.broadcast(); 120 } 121 122 void cancel() 123 { 124 m_canceled = true; 125 126 // FIXME (NetworkProcess): <rdar://problem/12886430>: Waking up all threads is quite inefficient. 95 127 m_condition.broadcast(); 96 128 } … … 101 133 102 134 HashMap<uint64_t, bool> m_responses; 135 bool m_canceled; 103 136 }; 104 137
Note:
See TracChangeset
for help on using the changeset viewer.