Changeset 214114 in webkit


Ignore:
Timestamp:
Mar 17, 2017 1:30:37 PM (7 years ago)
Author:
achristensen@apple.com
Message:

Make SocketStreamHandle virtual functions asynchronous
https://bugs.webkit.org/show_bug.cgi?id=169818

Reviewed by Andy Estes.

No change in behavior. Instead of returning immediately, call a completion handler.
This is in preparation for making them truly asynchronous.

I still need to be able to synchronously get the number of buffered bytes, but the
buffer itself will soon be in the NetworkProcess with a new subclass of SocketStreamHandle
that messages across IPC. The number of buffered bytes will still be stored in the WebProcess,
and when it updates, the message from SocketStreamHandleClient::didUpdateBufferedAmount will update it.

  • CMakeLists.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • platform/network/SocketStreamHandle.cpp:

(WebCore::SocketStreamHandle::send):
(WebCore::SocketStreamHandle::close):
(WebCore::SocketStreamHandle::sendPendingData): Deleted.

  • platform/network/SocketStreamHandle.h:

(WebCore::SocketStreamHandle::bufferedAmount): Deleted.

  • platform/network/SocketStreamHandleImpl.cpp: Added.

(WebCore::SocketStreamHandleImpl::platformSend):
(WebCore::SocketStreamHandleImpl::sendPendingData):
(WebCore::SocketStreamHandleImpl::bufferedAmount):
m_buffer was moved from SocketStreamHandle to SocketStreamHandleImpl, so some of the logic must move with it.
I moved as much logic that was shared in the superclass to a new shared location for code shared among the subclass implementations.

  • platform/network/cf/SocketStreamHandleImpl.h:
  • platform/network/cf/SocketStreamHandleImplCFNet.cpp:

(WebCore::SocketStreamHandleImpl::platformSendInternal):
(WebCore::SocketStreamHandleImpl::platformSend): Deleted.

  • platform/network/curl/SocketStreamHandleImpl.h:
  • platform/network/curl/SocketStreamHandleImplCurl.cpp:

(WebCore::SocketStreamHandleImpl::platformSendInternal):
(WebCore::SocketStreamHandleImpl::platformSend): Deleted.

  • platform/network/soup/SocketStreamHandleImpl.h:
  • platform/network/soup/SocketStreamHandleImplSoup.cpp:

(WebCore::SocketStreamHandleImpl::platformSendInternal):
(WebCore::SocketStreamHandleImpl::platformSend): Deleted.

Location:
trunk/Source/WebCore
Files:
1 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r214105 r214114  
    24242424    platform/network/ResourceResponseBase.cpp
    24252425    platform/network/SocketStreamHandle.cpp
     2426    platform/network/SocketStreamHandleImpl.cpp
    24262427    platform/network/SynchronousLoaderClient.cpp
    24272428
  • trunk/Source/WebCore/ChangeLog

    r214113 r214114  
     12017-03-17  Alex Christensen  <achristensen@webkit.org>
     2
     3        Make SocketStreamHandle virtual functions asynchronous
     4        https://bugs.webkit.org/show_bug.cgi?id=169818
     5
     6        Reviewed by Andy Estes.
     7
     8        No change in behavior.  Instead of returning immediately, call a completion handler.
     9        This is in preparation for making them truly asynchronous.
     10
     11        I still need to be able to synchronously get the number of buffered bytes, but the
     12        buffer itself will soon be in the NetworkProcess with a new subclass of SocketStreamHandle
     13        that messages across IPC.  The number of buffered bytes will still be stored in the WebProcess,
     14        and when it updates, the message from SocketStreamHandleClient::didUpdateBufferedAmount will update it.
     15
     16        * CMakeLists.txt:
     17        * WebCore.xcodeproj/project.pbxproj:
     18        * platform/network/SocketStreamHandle.cpp:
     19        (WebCore::SocketStreamHandle::send):
     20        (WebCore::SocketStreamHandle::close):
     21        (WebCore::SocketStreamHandle::sendPendingData): Deleted.
     22        * platform/network/SocketStreamHandle.h:
     23        (WebCore::SocketStreamHandle::bufferedAmount): Deleted.
     24        * platform/network/SocketStreamHandleImpl.cpp: Added.
     25        (WebCore::SocketStreamHandleImpl::platformSend):
     26        (WebCore::SocketStreamHandleImpl::sendPendingData):
     27        (WebCore::SocketStreamHandleImpl::bufferedAmount):
     28        m_buffer was moved from SocketStreamHandle to SocketStreamHandleImpl, so some of the logic must move with it.
     29        I moved as much logic that was shared in the superclass to a new shared location for code shared among the subclass implementations.
     30        * platform/network/cf/SocketStreamHandleImpl.h:
     31        * platform/network/cf/SocketStreamHandleImplCFNet.cpp:
     32        (WebCore::SocketStreamHandleImpl::platformSendInternal):
     33        (WebCore::SocketStreamHandleImpl::platformSend): Deleted.
     34        * platform/network/curl/SocketStreamHandleImpl.h:
     35        * platform/network/curl/SocketStreamHandleImplCurl.cpp:
     36        (WebCore::SocketStreamHandleImpl::platformSendInternal):
     37        (WebCore::SocketStreamHandleImpl::platformSend): Deleted.
     38        * platform/network/soup/SocketStreamHandleImpl.h:
     39        * platform/network/soup/SocketStreamHandleImplSoup.cpp:
     40        (WebCore::SocketStreamHandleImpl::platformSendInternal):
     41        (WebCore::SocketStreamHandleImpl::platformSend): Deleted.
     42
    1432017-03-17  Antti Koivisto  <antti@apple.com>
    244
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r214074 r214114  
    26482648                5C5381B21D87D4B200E2EBE6 /* URLSearchParams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C5381B01D87D45700E2EBE6 /* URLSearchParams.cpp */; };
    26492649                5C5381B51D87E08700E2EBE6 /* JSURLSearchParams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C5381B31D87E08100E2EBE6 /* JSURLSearchParams.cpp */; };
     2650                5C668E651E7C6C4000D32B3B /* SocketStreamHandleImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C668E641E7C6C3500D32B3B /* SocketStreamHandleImpl.cpp */; };
    26502651                5C688AA11D380BF8000B54FA /* ThreadableWebSocketChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C688AA01D380509000B54FA /* ThreadableWebSocketChannel.cpp */; };
    26512652                5C688AA31D3814BF000B54FA /* SocketProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C688AA21D38126F000B54FA /* SocketProvider.cpp */; };
     
    1033910340                5C5381B31D87E08100E2EBE6 /* JSURLSearchParams.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSURLSearchParams.cpp; sourceTree = "<group>"; };
    1034010341                5C5381B41D87E08100E2EBE6 /* JSURLSearchParams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSURLSearchParams.h; sourceTree = "<group>"; };
     10342                5C668E641E7C6C3500D32B3B /* SocketStreamHandleImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SocketStreamHandleImpl.cpp; sourceTree = "<group>"; };
    1034110343                5C688AA01D380509000B54FA /* ThreadableWebSocketChannel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ThreadableWebSocketChannel.cpp; sourceTree = "<group>"; };
    1034210344                5C688AA21D38126F000B54FA /* SocketProvider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SocketProvider.cpp; sourceTree = "<group>"; };
     
    1876418766                                510D4A31103165EE0049EA54 /* SocketStreamHandle.h */,
    1876518767                                510D4A32103165EE0049EA54 /* SocketStreamHandleClient.h */,
     18768                                5C668E641E7C6C3500D32B3B /* SocketStreamHandleImpl.cpp */,
    1876618769                                E180811016FCF42E00B80D07 /* SynchronousLoaderClient.cpp */,
    1876718770                                E180811516FCF9CB00B80D07 /* SynchronousLoaderClient.h */,
     
    3075430757                                A9C6E4EB0D745E2B006442E9 /* DOMPlugin.cpp in Sources */,
    3075530758                                A9C6E4EF0D745E38006442E9 /* DOMPluginArray.cpp in Sources */,
     30759                                5C668E651E7C6C4000D32B3B /* SocketStreamHandleImpl.cpp in Sources */,
    3075630760                                BC5A86840C33676000EEA649 /* DOMSelection.cpp in Sources */,
    3075730761                                C55610F111A704EB00B82D27 /* DOMStringList.cpp in Sources */,
  • trunk/Source/WebCore/platform/network/SocketStreamHandle.cpp

    r214106 r214114  
    3737namespace WebCore {
    3838
    39 const unsigned bufferSize = 100 * 1024 * 1024;
    40 
    4139SocketStreamHandle::SocketStreamHandle(const URL& url, SocketStreamHandleClient& client)
    4240    : m_url(url)
     
    5553    if (m_state == Connecting || m_state == Closing)
    5654        return completionHandler(false);
    57     if (!m_buffer.isEmpty()) {
    58         if (m_buffer.size() + length > bufferSize) {
    59             // FIXME: report error to indicate that buffer has no more space.
    60             return completionHandler(false);
    61         }
    62         m_buffer.append(data, length);
    63         m_client.didUpdateBufferedAmount(static_cast<SocketStreamHandle&>(*this), bufferedAmount());
    64         return completionHandler(true);
    65     }
    66     size_t bytesWritten = 0;
    67     if (m_state == Open) {
    68         if (auto result = platformSend(data, length))
    69             bytesWritten = result.value();
    70         else
    71             return completionHandler(false);
    72     }
    73     if (m_buffer.size() + length - bytesWritten > bufferSize) {
    74         // FIXME: report error to indicate that buffer has no more space.
    75         return completionHandler(false);
    76     }
    77     if (bytesWritten < length) {
    78         m_buffer.append(data + bytesWritten, length - bytesWritten);
    79         m_client.didUpdateBufferedAmount(static_cast<SocketStreamHandle&>(*this), bufferedAmount());
    80     }
    81     return completionHandler(true);
     55    platformSend(data, length, WTFMove(completionHandler));
    8256}
    8357
     
    8761        return;
    8862    m_state = Closing;
    89     if (!m_buffer.isEmpty())
     63    if (bufferedAmount())
    9064        return;
    9165    disconnect();
     
    10074}
    10175
    102 bool SocketStreamHandle::sendPendingData()
    103 {
    104     if (m_state != Open && m_state != Closing)
    105         return false;
    106     if (m_buffer.isEmpty()) {
    107         if (m_state == Open)
    108             return false;
    109         if (m_state == Closing) {
    110             disconnect();
    111             return false;
    112         }
    113     }
    114     bool pending;
    115     do {
    116         auto result = platformSend(m_buffer.firstBlockData(), m_buffer.firstBlockSize());
    117         if (!result)
    118             return false;
    119         size_t bytesWritten = result.value();
    120         if (!bytesWritten)
    121             return false;
    122         pending = bytesWritten != m_buffer.firstBlockSize();
    123         ASSERT(m_buffer.size() - bytesWritten <= bufferSize);
    124         m_buffer.consume(bytesWritten);
    125     } while (!pending && !m_buffer.isEmpty());
    126     m_client.didUpdateBufferedAmount(static_cast<SocketStreamHandle&>(*this), bufferedAmount());
    127     return true;
    128 }
    129 
    13076} // namespace WebCore
  • trunk/Source/WebCore/platform/network/SocketStreamHandle.h

    r214106 r214114  
    3333
    3434#include "URL.h"
    35 #include <wtf/StreamBuffer.h>
    3635#include <wtf/ThreadSafeRefCounted.h>
    3736
     
    4948    void close(); // Disconnect after all data in buffer are sent.
    5049    void disconnect();
    51     size_t bufferedAmount() const { return m_buffer.size(); }
     50    virtual size_t bufferedAmount() = 0;
    5251
    5352protected:
    5453    SocketStreamHandle(const URL&, SocketStreamHandleClient&);
    5554
    56     bool sendPendingData();
    57     virtual std::optional<size_t> platformSend(const char* data, size_t length) = 0;
     55    virtual void platformSend(const char* data, size_t length, Function<void(bool)>&&) = 0;
    5856    virtual void platformClose() = 0;
    5957
    6058    URL m_url;
    6159    SocketStreamHandleClient& m_client;
    62     StreamBuffer<char, 1024 * 1024> m_buffer;
    6360    SocketStreamState m_state;
    6461};
  • trunk/Source/WebCore/platform/network/cf/SocketStreamHandleImpl.h

    r214106 r214114  
    3535#include "SocketStreamHandle.h"
    3636#include <wtf/RetainPtr.h>
     37#include <wtf/StreamBuffer.h>
    3738
    3839typedef struct __CFHTTPMessage* CFHTTPMessageRef;
     
    5152
    5253private:
    53     std::optional<size_t> platformSend(const char* data, size_t length) final;
     54    void platformSend(const char* data, size_t length, Function<void(bool)>&&) final;
    5455    void platformClose() final;
     56    size_t bufferedAmount() final;
     57    std::optional<size_t> platformSendInternal(const char*, size_t);
     58    bool sendPendingData();
    5559
    5660    WEBCORE_EXPORT SocketStreamHandleImpl(const URL&, SocketStreamHandleClient&, SessionID, const String& credentialPartition);
     
    98102    SessionID m_sessionID;
    99103    String m_credentialPartition;
     104   
     105    StreamBuffer<char, 1024 * 1024> m_buffer;
     106    static const unsigned maxBufferSize = 100 * 1024 * 1024;
    100107};
    101108
  • trunk/Source/WebCore/platform/network/cf/SocketStreamHandleImplCFNet.cpp

    r214073 r214114  
    654654}
    655655
    656 std::optional<size_t> SocketStreamHandleImpl::platformSend(const char* data, size_t length)
     656std::optional<size_t> SocketStreamHandleImpl::platformSendInternal(const char* data, size_t length)
    657657{
    658658    if (!CFWriteStreamCanAcceptBytes(m_writeStream.get()))
  • trunk/Source/WebCore/platform/network/curl/SocketStreamHandleImpl.h

    r211751 r214114  
    4343#include <wtf/Lock.h>
    4444#include <wtf/RefCounted.h>
     45#include <wtf/StreamBuffer.h>
    4546#include <wtf/Threading.h>
    4647
     
    5859    SocketStreamHandleImpl(const URL&, SocketStreamHandleClient&);
    5960
    60     std::optional<size_t> platformSend(const char* data, size_t length) final;
     61    void platformSend(const char* data, size_t length, Function<void(bool)>&&) final;
    6162    void platformClose() final;
     63    size_t bufferedAmount() final;
     64    std::optional<size_t> platformSendInternal(const char*, size_t);
     65    bool sendPendingData();
    6266
    6367    bool readData(CURL*);
     
    9599    Deque<SocketData> m_sendData;
    96100    Deque<SocketData> m_receiveData;
     101
     102    StreamBuffer<char, 1024 * 1024> m_buffer;
     103    static const unsigned maxBufferSize = 100 * 1024 * 1024;
    97104};
    98105
  • trunk/Source/WebCore/platform/network/curl/SocketStreamHandleImplCurl.cpp

    r208985 r214114  
    6767}
    6868
    69 std::optional<size_t> SocketStreamHandleImpl::platformSend(const char* data, size_t length)
     69std::optional<size_t> SocketStreamHandleImpl::platformSendInternal(const char* data, size_t length)
    7070{
    7171    LOG(Network, "SocketStreamHandle %p platformSend", this);
  • trunk/Source/WebCore/platform/network/soup/SocketStreamHandleImpl.h

    r211751 r214114  
    3939#include "SessionID.h"
    4040#include <wtf/RefCounted.h>
     41#include <wtf/StreamBuffer.h>
    4142#include <wtf/glib/GRefPtr.h>
    4243
     
    5657    SocketStreamHandleImpl(const URL&, SocketStreamHandleClient&);
    5758
    58     std::optional<size_t> platformSend(const char* data, size_t length) final;
     59    void platformSend(const char* data, size_t length, Function<void(bool)>&&) final;
    5960    void platformClose() final;
     61    size_t bufferedAmount() final;
     62    std::optional<size_t> platformSendInternal(const char*, size_t);
     63    bool sendPendingData();
    6064
    6165    void beginWaitingForSocketWritability();
     
    7781    GRefPtr<GCancellable> m_cancellable;
    7882    std::unique_ptr<char[]> m_readBuffer;
     83
     84    StreamBuffer<char, 1024 * 1024> m_buffer;
     85    static const unsigned maxBufferSize = 100 * 1024 * 1024;
    7986};
    8087
  • trunk/Source/WebCore/platform/network/soup/SocketStreamHandleImplSoup.cpp

    r214090 r214114  
    191191}
    192192
    193 std::optional<size_t> SocketStreamHandleImpl::platformSend(const char* data, size_t length)
     193std::optional<size_t> SocketStreamHandleImpl::platformSendInternal(const char* data, size_t length)
    194194{
    195195    LOG(Network, "SocketStreamHandle %p platformSend", this);
Note: See TracChangeset for help on using the changeset viewer.