Changeset 139516 in webkit


Ignore:
Timestamp:
Jan 11, 2013 4:08:30 PM (11 years ago)
Author:
ap@apple.com
Message:

[WK2] Network process unblocks all waiting threads when any sync reply arrives
https://bugs.webkit.org/show_bug.cgi?id=106713

Reviewed by Brady Eidson.

Switch to sending sync CoreIPC messages, which is now possible.

  • NetworkProcess/NetworkConnectionToWebProcess.h:
  • NetworkProcess/NetworkConnectionToWebProcess.cpp: (WebKit::NetworkConnectionToWebProcess::didClose): We no longer have response maps.
  • NetworkProcess/NetworkResourceLoader.cpp: (WebKit::NetworkResourceLoader::willSendRequest): Just send a sync message. (WebKit::NetworkResourceLoader::canAuthenticateAgainstProtectionSpace): Ditto. (WebKit::NetworkResourceLoader::didReceiveDataArray): Added an unrelated assertion.
  • NetworkProcess/NetworkResourceLoader.h:
  • NetworkProcess/NetworkResourceLoader.messages.in: Removed no longer used reply messages and their handlers.
  • Shared/BlockingResponseMap.h: Removed a bool version, which was not perfectly safe, and only used in NetworkProcess. (BlockingResponseMap::didReceiveResponse): Updated a still valid FIXME to not refer to network process. (BlockingResponseMap::cancel): Ditto.
  • WebProcess/Network/NetworkProcessConnection.h:
  • WebProcess/Network/NetworkProcessConnection.cpp: (WebKit::NetworkProcessConnection::didReceiveSyncMessage): Plumbing to handle sync messages.
  • WebProcess/Network/WebResourceLoader.cpp: (WebKit::WebResourceLoader::willSendRequest): (WebKit::WebResourceLoader::canAuthenticateAgainstProtectionSpace):
  • WebProcess/Network/WebResourceLoader.h:
  • WebProcess/Network/WebResourceLoader.messages.in: Updated (simplified) sync messages and their handlers.
Location:
trunk/Source/WebKit2
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r139515 r139516  
     12013-01-11  Alexey Proskuryakov  <ap@apple.com>
     2
     3        [WK2] Network process unblocks all waiting threads when any sync reply arrives
     4        https://bugs.webkit.org/show_bug.cgi?id=106713
     5
     6        Reviewed by Brady Eidson.
     7
     8        Switch to sending sync CoreIPC messages, which is now possible.
     9
     10        * NetworkProcess/NetworkConnectionToWebProcess.h:
     11        * NetworkProcess/NetworkConnectionToWebProcess.cpp: (WebKit::NetworkConnectionToWebProcess::didClose):
     12        We no longer have response maps.
     13
     14        * NetworkProcess/NetworkResourceLoader.cpp:
     15        (WebKit::NetworkResourceLoader::willSendRequest): Just send a sync message.
     16        (WebKit::NetworkResourceLoader::canAuthenticateAgainstProtectionSpace): Ditto.
     17        (WebKit::NetworkResourceLoader::didReceiveDataArray): Added an unrelated assertion.
     18
     19        * NetworkProcess/NetworkResourceLoader.h:
     20        * NetworkProcess/NetworkResourceLoader.messages.in:
     21        Removed no longer used reply messages and their handlers.
     22
     23        * Shared/BlockingResponseMap.h: Removed a bool version, which was not perfectly
     24        safe, and only used in NetworkProcess.
     25        (BlockingResponseMap::didReceiveResponse): Updated a still valid FIXME to not refer
     26        to network process.
     27        (BlockingResponseMap::cancel): Ditto.
     28
     29        * WebProcess/Network/NetworkProcessConnection.h:
     30        * WebProcess/Network/NetworkProcessConnection.cpp:
     31        (WebKit::NetworkProcessConnection::didReceiveSyncMessage):
     32        Plumbing to handle sync messages.
     33
     34        * WebProcess/Network/WebResourceLoader.cpp:
     35        (WebKit::WebResourceLoader::willSendRequest):
     36        (WebKit::WebResourceLoader::canAuthenticateAgainstProtectionSpace):
     37        * WebProcess/Network/WebResourceLoader.h:
     38        * WebProcess/Network/WebResourceLoader.messages.in:
     39        Updated (simplified) sync messages and their handlers.
     40
    1412013-01-11  Alexey Proskuryakov  <ap@apple.com>
    242
  • trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp

    r138413 r139516  
    104104    NetworkProcess::shared().removeNetworkConnectionToWebProcess(this);
    105105
    106     // Unblock waiting threads.
    107     m_willSendRequestResponseMap.cancel();
    108     m_canAuthenticateAgainstProtectionSpaceResponseMap.cancel();
    109 
    110106    Vector<NetworkConnectionToWebProcessObserver*> observers;
    111107    copyToVector(m_observers, observers);
  • trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h

    r138301 r139516  
    6363    bool isSerialLoadingEnabled() const { return m_serialLoadingEnabled; }
    6464
    65     BlockingResponseMap<WebCore::ResourceRequest*>& willSendRequestResponseMap() { return m_willSendRequestResponseMap; }
    66     BlockingBoolResponseMap& canAuthenticateAgainstProtectionSpaceResponseMap() { return m_canAuthenticateAgainstProtectionSpaceResponseMap; }
    67 
    6865private:
    6966    NetworkConnectionToWebProcess(CoreIPC::Connection::Identifier);
     
    9794    HashSet<NetworkConnectionToWebProcessObserver*> m_observers;
    9895
    99     BlockingResponseMap<WebCore::ResourceRequest*> m_willSendRequestResponseMap;
    100     BlockingBoolResponseMap m_canAuthenticateAgainstProtectionSpaceResponseMap;
    101 
    10296    bool m_serialLoadingEnabled;
    10397};
  • trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp

    r138319 r139516  
    183183}
    184184
    185 static uint64_t generateWillSendRequestID()
    186 {
    187     static int64_t uniqueWillSendRequestID;
    188     return atomicIncrement(&uniqueWillSendRequestID);
    189 }
    190 
    191185void NetworkResourceLoader::willSendRequest(ResourceHandle*, ResourceRequest& request, const ResourceResponse& redirectResponse)
    192186{
    193187    // We only expect to get the willSendRequest callback from ResourceHandle as the result of a redirect.
    194188    ASSERT(!redirectResponse.isNull());
    195 
    196     uint64_t requestID = generateWillSendRequestID();
    197 
    198     if (!send(Messages::WebResourceLoader::WillSendRequest(requestID, request, redirectResponse))) {
     189    ASSERT(!isMainThread());
     190
     191    if (!sendSync(Messages::WebResourceLoader::WillSendRequest(request, redirectResponse), Messages::WebResourceLoader::WillSendRequest::Reply(request)))
    199192        request = ResourceRequest();
    200         return;
    201     }
    202 
    203     OwnPtr<ResourceRequest> newRequest = m_connection->willSendRequestResponseMap().waitForResponse(requestID);
    204     request = newRequest ? *newRequest : ResourceRequest();
    205 
    206     RunLoop::main()->dispatch(WTF::bind(&NetworkResourceLoadScheduler::receivedRedirect, &NetworkProcess::shared().networkResourceLoadScheduler(), m_identifier, request.url()));
    207 }
    208 
    209 void NetworkResourceLoader::willSendRequestHandled(uint64_t requestID, const WebCore::ResourceRequest& newRequest)
    210 {
    211     m_connection->willSendRequestResponseMap().didReceiveResponse(requestID, adoptPtr(new ResourceRequest(newRequest)));
    212193}
    213194
     
    303284
    304285#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
    305 static uint64_t generateCanAuthenticateAgainstProtectionSpaceID()
    306 {
    307     static int64_t uniqueCanAuthenticateAgainstProtectionSpaceID;
    308     return atomicIncrement(&uniqueCanAuthenticateAgainstProtectionSpaceID);
    309 }
    310 
    311286bool NetworkResourceLoader::canAuthenticateAgainstProtectionSpace(ResourceHandle*, const ProtectionSpace& protectionSpace)
    312287{
    313     uint64_t requestID = generateCanAuthenticateAgainstProtectionSpaceID();
    314 
    315     if (!send(Messages::WebResourceLoader::CanAuthenticateAgainstProtectionSpace(requestID, protectionSpace)))
     288    ASSERT(!isMainThread());
     289
     290    bool result;
     291    if (!sendSync(Messages::WebResourceLoader::CanAuthenticateAgainstProtectionSpace(protectionSpace), Messages::WebResourceLoader::CanAuthenticateAgainstProtectionSpace::Reply(result)))
    316292        return false;
    317293
    318     return m_connection->canAuthenticateAgainstProtectionSpaceResponseMap().waitForResponse(requestID);
    319 }
    320 
    321 void NetworkResourceLoader::canAuthenticateAgainstProtectionSpaceHandled(uint64_t requestID, bool canAuthenticate)
    322 {
    323     m_connection->canAuthenticateAgainstProtectionSpaceResponseMap().didReceiveResponse(requestID, canAuthenticate);
     294    return result;
    324295}
    325296#endif
     
    334305void NetworkResourceLoader::didReceiveDataArray(WebCore::ResourceHandle*, CFArrayRef)
    335306{
     307    ASSERT_NOT_REACHED();
    336308    notImplemented();
    337309}
  • trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h

    r138319 r139516  
    111111    NetworkResourceLoader(const NetworkResourceLoadParameters&, ResourceLoadIdentifier, NetworkConnectionToWebProcess*);
    112112
    113     void willSendRequestHandled(uint64_t requestID, const WebCore::ResourceRequest&);
    114     void canAuthenticateAgainstProtectionSpaceHandled(uint64_t requestID, bool canAuthenticate);
    115113    void receivedAuthenticationCredential(const WebCore::AuthenticationChallenge&, const WebCore::Credential&);
    116114    void receivedRequestToContinueWithoutAuthenticationCredential(const WebCore::AuthenticationChallenge&);
  • trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.messages.in

    r135179 r139516  
    2424
    2525messages -> NetworkResourceLoader {
    26     WillSendRequestHandled(uint64_t requestID, WebCore::ResourceRequest newRequest)
    27     CanAuthenticateAgainstProtectionSpaceHandled(uint64_t requestID, bool canAuthenticate)
    28    
    2926    ReceivedAuthenticationCredential(WebCore::AuthenticationChallenge challenge, WebCore::Credential credential)
    3027    ReceivedRequestToContinueWithoutAuthenticationCredential(WebCore::AuthenticationChallenge challenge)
  • trunk/Source/WebKit2/Shared/BlockingResponseMap.h

    r137783 r139516  
    6262
    6363        m_responses.set(requestID, response);
    64         // FIXME (NetworkProcess): <rdar://problem/12886430>: Waking up all threads is quite inefficient.
     64        // FIXME: Waking up all threads is quite inefficient.
    6565        m_condition.broadcast();
    6666    }
     
    7070        m_canceled = true;
    7171
    72         // FIXME (NetworkProcess): <rdar://problem/12886430>: Waking up all threads is quite inefficient.
     72        // FIXME: Waking up all threads is quite inefficient.
    7373        m_condition.broadcast();
    7474    }
     
    8282};
    8383
    84 class BlockingBoolResponseMap {
    85 WTF_MAKE_NONCOPYABLE(BlockingBoolResponseMap);
    86 public:
    87     BlockingBoolResponseMap() : m_canceled(false) { }
    88     ~BlockingBoolResponseMap() { ASSERT(m_responses.isEmpty()); }
    89 
    90     bool waitForResponse(uint64_t requestID)
    91     {
    92         while (true) {
    93             MutexLocker locker(m_mutex);
    94 
    95             // FIXME: Differentiate between canceled wait and a negative response.
    96             if (m_canceled)
    97                 return false;
    98 
    99             HashMap<uint64_t, bool>::iterator iter = m_responses.find(requestID);
    100             if (iter != m_responses.end()) {
    101                 bool result = iter->value;
    102                 m_responses.remove(iter);
    103                 return result;
    104             }
    105 
    106             m_condition.wait(m_mutex);
    107         }
    108 
    109         return false;
    110     }
    111 
    112     void didReceiveResponse(uint64_t requestID, bool response)
    113     {
    114         MutexLocker locker(m_mutex);
    115         ASSERT(!m_responses.contains(requestID));
    116 
    117         m_responses.set(requestID, response);
    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.
    127         m_condition.broadcast();
    128     }
    129 
    130 private:
    131     Mutex m_mutex;
    132     ThreadCondition m_condition;
    133 
    134     HashMap<uint64_t, bool> m_responses;
    135     bool m_canceled;
    136 };
    137 
    13884#endif // BlockingResponseMap_h
  • trunk/Source/WebKit2/WebProcess/Network/NetworkProcessConnection.cpp

    r138683 r139516  
    6363}
    6464
     65void NetworkProcessConnection::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::MessageDecoder& decoder, OwnPtr<CoreIPC::MessageEncoder>& replyEncoder)
     66{
     67    if (messageID.is<CoreIPC::MessageClassWebResourceLoader>()) {
     68        if (WebResourceLoader* webResourceLoader = WebProcess::shared().webResourceLoadScheduler().webResourceLoaderForIdentifier(decoder.destinationID()))
     69            webResourceLoader->didReceiveSyncWebResourceLoaderMessage(connection, messageID, decoder, replyEncoder);
     70       
     71        return;
     72    }
     73
     74    ASSERT_NOT_REACHED();
     75}
     76
    6577void NetworkProcessConnection::didClose(CoreIPC::Connection*)
    6678{
  • trunk/Source/WebKit2/WebProcess/Network/NetworkProcessConnection.h

    r135179 r139516  
    6262    // CoreIPC::Connection::Client
    6363    virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&);
     64    virtual void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&, OwnPtr<CoreIPC::MessageEncoder>&);
    6465    virtual void didClose(CoreIPC::Connection*);
    6566    virtual void didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::StringReference messageReceiverName, CoreIPC::StringReference messageName) OVERRIDE;
  • trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.cpp

    r138413 r139516  
    6969}
    7070
    71 void WebResourceLoader::willSendRequest(uint64_t requestID, const ResourceRequest& proposedRequest, const ResourceResponse& redirectResponse)
     71void WebResourceLoader::willSendRequest(const ResourceRequest& proposedRequest, const ResourceResponse& redirectResponse, ResourceRequest& newRequest)
    7272{
    7373    LOG(Network, "(WebProcess) WebResourceLoader::willSendRequest to '%s'", proposedRequest.url().string().utf8().data());
    7474   
    75     ResourceRequest newRequest = proposedRequest;
     75    newRequest = proposedRequest;
    7676    m_coreLoader->willSendRequest(newRequest, redirectResponse);
    77 
    78     send(Messages::NetworkResourceLoader::WillSendRequestHandled(requestID, newRequest));
    7977}
    8078
     
    123121}
    124122
    125 void WebResourceLoader::canAuthenticateAgainstProtectionSpace(uint64_t requestID, const ProtectionSpace& protectionSpace)
     123void WebResourceLoader::canAuthenticateAgainstProtectionSpace(const ProtectionSpace& protectionSpace, bool& result)
    126124{
    127     send(Messages::NetworkResourceLoader::CanAuthenticateAgainstProtectionSpaceHandled(requestID, m_coreLoader->canAuthenticateAgainstProtectionSpace(protectionSpace)));
     125    result = m_coreLoader->canAuthenticateAgainstProtectionSpace(protectionSpace);
    128126}
    129127
  • trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.h

    r138387 r139516  
    6767
    6868    void didReceiveWebResourceLoaderMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&);
     69    void didReceiveSyncWebResourceLoaderMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&, OwnPtr<CoreIPC::MessageEncoder>&);
    6970
    7071    using RefCounted<WebResourceLoader>::ref;
     
    8081    WebResourceLoader(PassRefPtr<WebCore::ResourceLoader>);
    8182
    82     void willSendRequest(uint64_t requestID, const WebCore::ResourceRequest&, const WebCore::ResourceResponse& redirectResponse);
     83    void willSendRequest(const WebCore::ResourceRequest&, const WebCore::ResourceResponse& redirectResponse, WebCore::ResourceRequest& newRequest);
    8384    void didReceiveResponseWithCertificateInfo(const WebCore::ResourceResponse&, const PlatformCertificateInfo&);
    8485    void didReceiveData(const CoreIPC::DataReference&, int64_t encodedDataLength, bool allAtOnce);
     
    8788    void didReceiveResource(const ShareableResource::Handle&, double finishTime);
    8889
    89     void canAuthenticateAgainstProtectionSpace(uint64_t requestID, const WebCore::ProtectionSpace&);
     90    void canAuthenticateAgainstProtectionSpace(const WebCore::ProtectionSpace&, bool& result);
    9091    void didReceiveAuthenticationChallenge(const WebCore::AuthenticationChallenge&);
    9192    void didCancelAuthenticationChallenge(const WebCore::AuthenticationChallenge&);
  • trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.messages.in

    r138206 r139516  
    2424
    2525    // FIXME (NetworkProcess): We'll need much more granularity for response messages.
    26     WillSendRequest(uint64_t requestID, WebCore::ResourceRequest request, WebCore::ResourceResponse redirectResponse)
     26    WillSendRequest(WebCore::ResourceRequest request, WebCore::ResourceResponse redirectResponse) -> (WebCore::ResourceRequest newRequest)
    2727    DidReceiveResponseWithCertificateInfo(WebCore::ResourceResponse response, WebKit::PlatformCertificateInfo certificateInfo)
    2828    DidReceiveData(CoreIPC::DataReference data, int64_t encodedDataLength, bool allAtOnce)
     
    3030    DidFailResourceLoad(WebCore::ResourceError error)
    3131   
    32     CanAuthenticateAgainstProtectionSpace(uint64_t requestID, WebCore::ProtectionSpace protectionSpace)
     32    CanAuthenticateAgainstProtectionSpace(WebCore::ProtectionSpace protectionSpace) -> (bool response)
    3333    DidReceiveAuthenticationChallenge(WebCore::AuthenticationChallenge challenge)
    3434    DidCancelAuthenticationChallenge(WebCore::AuthenticationChallenge challenge)
Note: See TracChangeset for help on using the changeset viewer.