Changeset 80551 in webkit


Ignore:
Timestamp:
Mar 8, 2011 1:14:10 AM (13 years ago)
Author:
andreas.kling@nokia.com
Message:

2011-03-08 Markus Goetz <guruz@guruz.de>

Reviewed by Kenneth Rohde Christiansen.

[Qt] Use the QNetworkAccessManager zerocopy feature
https://bugs.webkit.org/show_bug.cgi?id=50082

The feature will be introduced in Qt 4.8.
This patch is backwards compatible with Qt 4.7.

  • WebCore.pro:
  • platform/SharedBuffer.cpp:
  • platform/SharedBuffer.h:
  • platform/network/qt/QNetworkReplyHandler.cpp: (WebCore::QNetworkReplyHandler::QNetworkReplyHandler): (WebCore::QNetworkReplyHandler::bufferedData): (WebCore::QNetworkReplyHandler::sendResponseIfNeeded): (WebCore::QNetworkReplyHandler::downloadProgress): (WebCore::QNetworkReplyHandler::forwardData): (WebCore::QNetworkReplyHandler::start):
  • platform/network/qt/QNetworkReplyHandler.h:
  • platform/network/qt/ResourceHandleQt.cpp: (WebCore::ResourceHandle::supportsBufferedData): (WebCore::ResourceHandle::bufferedData):
  • platform/qt/SharedBufferQt.cpp: (WebCore::SharedBuffer::wrapQtByteBlock): (WebCore::SharedBuffer::hasPlatformData): (WebCore::SharedBuffer::platformData): (WebCore::SharedBuffer::platformDataSize): (WebCore::SharedBuffer::maybeTransferPlatformData): (WebCore::SharedBuffer::clearPlatformData):
Location:
trunk/Source/WebCore
Files:
2 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r80548 r80551  
     12011-03-08  Markus Goetz  <guruz@guruz.de>
     2
     3        Reviewed by Kenneth Rohde Christiansen.
     4
     5        [Qt] Use the QNetworkAccessManager zerocopy feature
     6        https://bugs.webkit.org/show_bug.cgi?id=50082
     7
     8        The feature will be introduced in Qt 4.8.
     9        This patch is backwards compatible with Qt 4.7.
     10
     11        * WebCore.pro:
     12        * platform/SharedBuffer.cpp:
     13        * platform/SharedBuffer.h:
     14        * platform/network/qt/QNetworkReplyHandler.cpp:
     15        (WebCore::QNetworkReplyHandler::QNetworkReplyHandler):
     16        (WebCore::QNetworkReplyHandler::bufferedData):
     17        (WebCore::QNetworkReplyHandler::sendResponseIfNeeded):
     18        (WebCore::QNetworkReplyHandler::downloadProgress):
     19        (WebCore::QNetworkReplyHandler::forwardData):
     20        (WebCore::QNetworkReplyHandler::start):
     21        * platform/network/qt/QNetworkReplyHandler.h:
     22        * platform/network/qt/ResourceHandleQt.cpp:
     23        (WebCore::ResourceHandle::supportsBufferedData):
     24        (WebCore::ResourceHandle::bufferedData):
     25        * platform/qt/SharedBufferQt.cpp:
     26        (WebCore::SharedBuffer::wrapQtByteBlock):
     27        (WebCore::SharedBuffer::hasPlatformData):
     28        (WebCore::SharedBuffer::platformData):
     29        (WebCore::SharedBuffer::platformDataSize):
     30        (WebCore::SharedBuffer::maybeTransferPlatformData):
     31        (WebCore::SharedBuffer::clearPlatformData):
     32
    1332011-03-08  Alejandro G. Castro  <alex@igalia.com>
    234
  • trunk/Source/WebCore/WebCore.pro

    r80536 r80551  
    19621962    platform/PopupMenu.h \
    19631963    platform/qt/ClipboardQt.h \
     1964    platform/qt/QtByteBlock.h \
    19641965    platform/qt/QWebPageClient.h \
    19651966    platform/qt/QtStyleOptionWebComboBox.h \
     
    24952496    platform/qt/PlatformTouchEventQt.cpp \
    24962497    platform/qt/PlatformTouchPointQt.cpp \
     2498    platform/qt/QtByteBlock.cpp \
    24972499    platform/qt/RenderThemeQt.cpp \
    24982500    platform/qt/ScrollbarQt.cpp \
  • trunk/Source/WebCore/platform/SharedBuffer.cpp

    r79434 r80551  
    240240}
    241241
    242 #if !USE(CF) || PLATFORM(QT)
     242#if !USE(CF) && !PLATFORM(QT)
    243243
    244244inline void SharedBuffer::clearPlatformData()
  • trunk/Source/WebCore/platform/SharedBuffer.h

    r79434 r80551  
    4646#endif
    4747
     48#if PLATFORM(QT)
     49#include "QtByteBlock.h"
     50#endif
     51
    4852namespace WebCore {
    4953   
     
    7377    CFDataRef createCFData();
    7478    static PassRefPtr<SharedBuffer> wrapCFData(CFDataRef);
     79#endif
     80#if PLATFORM(QT)
     81    static PassRefPtr<SharedBuffer> wrapQtByteBlock(PassRefPtr<QtByteBlock>);
    7582#endif
    7683
     
    135142    RetainPtr<CFDataRef> m_cfData;
    136143#endif
     144#if PLATFORM(QT)
     145    RefPtr<QtByteBlock> m_qtByteBlock;
     146#endif
     147
    137148};
    138149   
  • trunk/Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp

    r79795 r80551  
    3232#include <QFile>
    3333#include <QFileInfo>
     34#include <QNetworkRequest>
    3435#include <QNetworkReply>
    3536#include <QNetworkCookie>
     37#include <QSharedPointer>
    3638#include <qwebframe.h>
    3739#include <qwebpage.h>
     
    5759
    5860static const int gMaxRecursionLimit = 10;
     61
     62Q_DECLARE_METATYPE(QSharedPointer<char>)
    5963
    6064namespace WebCore {
     
    196200    , m_shouldForwardData(false)
    197201    , m_redirectionTries(gMaxRecursionLimit)
     202    , m_usingZeroCopy(false)
    198203{
    199204    const ResourceRequest &r = m_resourceHandle->firstRequest();
     
    223228    m_request = r.toNetworkRequest(originatingObject);
    224229
     230    // We allow the QNetworkAccessManager to allocate the whole buffer up to a certain size.
     231    m_request.setAttribute(QNetworkRequest::MaximumDownloadBufferSizeAttribute, 1024 * 256); // 256 kB.
     232
    225233    if (m_loadMode == LoadSynchronously)
    226234        m_request.setAttribute(gSynchronousNetworkRequestAttribute, true);
     
    278286}
    279287
     288PassRefPtr<SharedBuffer> QNetworkReplyHandler::bufferedData()
     289{
     290     return m_bufferedData;
     291}
     292
    280293static bool ignoreHttpError(QNetworkReply* reply, bool receivedData)
    281294{
     
    359372    if (!client)
    360373        return;
     374
     375    // Check if there is a zerocopy buffer.
     376    QVariant downloadBufferVariant = m_reply->attribute(QNetworkRequest::DownloadBufferAttribute);
     377    QSharedPointer<char> downloadBuffer = downloadBufferVariant.value<QSharedPointer<char> >();
     378    if (!downloadBuffer.isNull()) {
     379        m_byteBlock = QtByteBlock::create(downloadBuffer);
     380        m_bufferedData = SharedBuffer::wrapQtByteBlock(m_byteBlock);
     381        m_usingZeroCopy = true;
     382    } else {
     383        // Use the legacy way of using QNetworkReply as a QIODevice.
     384        m_bufferedData = SharedBuffer::create();
     385        m_usingZeroCopy = false;
     386    }
    361387
    362388    WTF::String contentType = m_reply->header(QNetworkRequest::ContentTypeHeader).toString();
     
    448474}
    449475
    450 void QNetworkReplyHandler::forwardData()
     476
     477void QNetworkReplyHandler::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
    451478{
    452479    m_shouldForwardData = (m_loadMode != LoadNormal);
     
    454481        return;
    455482
     483    if (!m_usingZeroCopy)
     484        return;
     485
     486    sendResponseIfNeeded();
     487
     488    // Don't emit the "Document has moved here" type of HTML.
     489    if (m_redirected)
     490        return;
     491
     492    if (!m_resourceHandle)
     493        return;
     494
     495    ResourceHandleClient* client = m_resourceHandle->client();
     496    if (!client)
     497        return;
     498
     499    // If the server just closes the connection we get a (0,0) progress but
     500    // we did not receive a metaDataChanged() signal before so there is no m_byteBlock.
     501    if (!m_byteBlock)
     502        return;
     503
     504    qint64 oldSize = m_byteBlock->size();
     505    m_byteBlock->setSize(bytesReceived);
     506    m_byteBlock->setCapacity(bytesTotal);
     507
     508    client->didReceiveData(m_resourceHandle, m_byteBlock->data() + oldSize,
     509                           bytesReceived - oldSize, bytesReceived - oldSize);
     510}
     511
     512void QNetworkReplyHandler::forwardData()
     513{
     514    m_shouldForwardData = (m_loadMode != LoadNormal);
     515    if (m_shouldForwardData)
     516        return;
     517
    456518    if (m_reply->bytesAvailable())
    457519        m_responseContainsData = true;
    458520
     521    if (m_usingZeroCopy)
     522        return;
     523
    459524    sendResponseIfNeeded();
    460525
     
    472537        return;
    473538
    474     if (!data.isEmpty())
     539    if (!data.isEmpty()) {
    475540        client->didReceiveData(m_resourceHandle, data.constData(), data.length(), data.length() /*FixMe*/);
     541        m_bufferedData->append(data.constData(), data.length());
     542    }
    476543}
    477544
     
    581648    }
    582649
     650    // For zero copy.
     651    connect(m_reply, SIGNAL(downloadProgress(qint64, qint64)),
     652            this, SLOT(downloadProgress(qint64, qint64)), SIGNAL_CONN);
     653
    583654    // Make this a direct function call once we require 4.6.1+.
    584655    connect(this, SIGNAL(processQueuedItems()),
  • trunk/Source/WebCore/platform/network/qt/QNetworkReplyHandler.h

    r79795 r80551  
    2424#include <QNetworkRequest>
    2525#include <QNetworkAccessManager>
     26
     27#include <SharedBuffer.h>
    2628
    2729#include "FormData.h"
     
    5658    QNetworkReply* release();
    5759
     60    PassRefPtr<SharedBuffer> bufferedData();
     61
    5862signals:
    5963    void processQueuedItems();
     
    6468    void forwardData();
    6569    void sendQueuedItems();
     70    void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
    6671    void uploadProgress(qint64 bytesSent, qint64 bytesTotal);
    6772
     
    8691    bool m_shouldForwardData;
    8792    int m_redirectionTries;
     93
     94    // Using the QNetworkAccessManager download buffer feature.
     95    bool m_usingZeroCopy;
     96
     97    // For zerocopy. Holds the download data.
     98    RefPtr<QtByteBlock> m_byteBlock;
     99
     100    // For zerocopy it wraps m_byteBlock, otherwise it holds data normally.
     101    RefPtr<SharedBuffer> m_bufferedData;
    88102};
    89103
  • trunk/Source/WebCore/platform/network/qt/ResourceHandleQt.cpp

    r79795 r80551  
    184184bool ResourceHandle::supportsBufferedData()
    185185{
    186     return false;
     186    return true;
    187187}
    188188
    189189PassRefPtr<SharedBuffer> ResourceHandle::bufferedData()
    190190{
    191     ASSERT_NOT_REACHED();
     191    if (d->m_job)
     192        return d->m_job->bufferedData();
     193
    192194    return 0;
    193195}
  • trunk/Source/WebCore/platform/qt/SharedBufferQt.cpp

    r60009 r80551  
    2626#include "config.h"
    2727#include "SharedBuffer.h"
     28#include "QtByteBlock.h"
    2829
    2930#include <QFile>
     
    4546}
    4647
     48PassRefPtr<SharedBuffer> SharedBuffer::wrapQtByteBlock(PassRefPtr<QtByteBlock> byteBlock)
     49{
     50    SharedBuffer* sharedBuffer = new SharedBuffer();
     51    sharedBuffer->m_qtByteBlock = byteBlock;
     52    return adoptRef(sharedBuffer);
     53}
     54
     55bool SharedBuffer::hasPlatformData() const
     56{
     57    return m_qtByteBlock;
     58}
     59
     60const char* SharedBuffer::platformData() const
     61{
     62    return static_cast<const char*>(m_qtByteBlock->data());
     63}
     64
     65unsigned SharedBuffer::platformDataSize() const
     66{
     67    return m_qtByteBlock->size();
     68}
     69
     70void SharedBuffer::maybeTransferPlatformData()
     71{
     72    if (!m_qtByteBlock)
     73        return;
     74
     75    RefPtr<QtByteBlock> byteBlock = m_qtByteBlock;
     76    m_qtByteBlock = 0;
     77    append(static_cast<const char*>(byteBlock->data()), byteBlock->size());
     78}
     79
     80void SharedBuffer::clearPlatformData()
     81{
     82    m_qtByteBlock = 0;
     83}
     84
     85
    4786} // namespace WebCore
Note: See TracChangeset for help on using the changeset viewer.