Title: [149383] trunk/Source/WebCore
Revision
149383
Author
[email protected]
Date
2013-04-30 11:20:16 -0700 (Tue, 30 Apr 2013)

Log Message

[SOUP] Move default buffer handling from ResourceHandleClient to ResourceHandlesoup
https://bugs.webkit.org/show_bug.cgi?id=115364

Reviewed by Martin Robinson.

ResourceHandleClient that is cross-platform file is not the right
place for the default ResourceHandle read buffer. We can make
getBuffer return 0 by default and handle it in ResourceHandleSoup,
creating a default buffer when the client doesn't provide one.

* platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
(StreamingClient::getOrCreateReadBuffer): Adapt to API change.
* platform/network/ResourceHandle.h:
(ResourceHandle): Add ensureReadBuffer().
* platform/network/ResourceHandleClient.cpp:
(WebCore::ResourceHandleClient::~ResourceHandleClient): Remove
soup specific code.
* platform/network/ResourceHandleClient.h:
(WebCore::ResourceHandleClient::getOrCreateReadBuffer): Rename
getBuffer() as getOrCreateReadBuffer() and use a reference for the
out parameter instead of a pointer.
(ResourceHandleClient): Remove soup specific code.
* platform/network/ResourceHandleInternal.h:
(WebCore::ResourceHandleInternal::ResourceHandleInternal): Rename
m_buffer and m_bufferSize as m_readBufferPtr and m_readBufferSize
and add m_readBuffer to be used as default read buffer.
* platform/network/soup/ResourceHandleSoup.cpp:
(WebCore::ResourceHandle::ensureReadBuffer): Helper function to
make usre we have a read buffer before a read operation. It first
checks if the client provides a buffer and if it doesn't it
creates or reuses the default buffer.
(WebCore::redirectSkipCallback): Call ensureReadBuffer() and adapt
to variable name changes.
(WebCore::cleanupSoupRequestOperation): Adapt to variable name
changes.
(WebCore::nextMultipartResponsePartCallback): Call
ensureReadBuffer() and adapt to variable name changes.
(WebCore::sendRequestCallback): Ditto.
(WebCore::readCallback): Ditto.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (149382 => 149383)


--- trunk/Source/WebCore/ChangeLog	2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/ChangeLog	2013-04-30 18:20:16 UTC (rev 149383)
@@ -1,3 +1,45 @@
+2013-04-30  Carlos Garcia Campos  <[email protected]>
+
+        [SOUP] Move default buffer handling from ResourceHandleClient to ResourceHandlesoup
+        https://bugs.webkit.org/show_bug.cgi?id=115364
+
+        Reviewed by Martin Robinson.
+
+        ResourceHandleClient that is cross-platform file is not the right
+        place for the default ResourceHandle read buffer. We can make
+        getBuffer return 0 by default and handle it in ResourceHandleSoup,
+        creating a default buffer when the client doesn't provide one.
+
+        * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
+        (StreamingClient::getOrCreateReadBuffer): Adapt to API change.
+        * platform/network/ResourceHandle.h:
+        (ResourceHandle): Add ensureReadBuffer().
+        * platform/network/ResourceHandleClient.cpp:
+        (WebCore::ResourceHandleClient::~ResourceHandleClient): Remove
+        soup specific code.
+        * platform/network/ResourceHandleClient.h:
+        (WebCore::ResourceHandleClient::getOrCreateReadBuffer): Rename
+        getBuffer() as getOrCreateReadBuffer() and use a reference for the
+        out parameter instead of a pointer.
+        (ResourceHandleClient): Remove soup specific code.
+        * platform/network/ResourceHandleInternal.h:
+        (WebCore::ResourceHandleInternal::ResourceHandleInternal): Rename
+        m_buffer and m_bufferSize as m_readBufferPtr and m_readBufferSize
+        and add m_readBuffer to be used as default read buffer.
+        * platform/network/soup/ResourceHandleSoup.cpp:
+        (WebCore::ResourceHandle::ensureReadBuffer): Helper function to
+        make usre we have a read buffer before a read operation. It first
+        checks if the client provides a buffer and if it doesn't it
+        creates or reuses the default buffer.
+        (WebCore::redirectSkipCallback): Call ensureReadBuffer() and adapt
+        to variable name changes.
+        (WebCore::cleanupSoupRequestOperation): Adapt to variable name
+        changes.
+        (WebCore::nextMultipartResponsePartCallback): Call
+        ensureReadBuffer() and adapt to variable name changes.
+        (WebCore::sendRequestCallback): Ditto.
+        (WebCore::readCallback): Ditto.
+
 2013-04-30  Andreas Kling  <[email protected]>
 
         REGRESSION(r149287): Assertion failure in fast/frames/flattening/iframe-flattening-crash.html

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp (149382 => 149383)


--- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp	2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp	2013-04-30 18:20:16 UTC (rev 149383)
@@ -53,7 +53,7 @@
         virtual void willSendRequest(ResourceHandle*, ResourceRequest&, const ResourceResponse&);
         virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
 
-        virtual char* getBuffer(int, int*);
+        virtual char* getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize);
 
         virtual void didReceiveData(ResourceHandle*, const char*, int, int);
         virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
@@ -924,7 +924,7 @@
         GST_ELEMENT_ERROR(m_src, CORE, FAILED, (0), (0));
 }
 
-char* StreamingClient::getBuffer(int requestedSize, int* actualSize)
+char* StreamingClient::getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize)
 {
     WebKitWebSrcPrivate* priv = m_src->priv;
 
@@ -938,7 +938,7 @@
 
     priv->buffer = adoptGRef(buffer);
 
-    *actualSize = getGstBufferSize(buffer);
+    actualSize = getGstBufferSize(buffer);
     return getGstBufferDataPointer(buffer);
 }
 

Modified: trunk/Source/WebCore/platform/network/ResourceHandle.h (149382 => 149383)


--- trunk/Source/WebCore/platform/network/ResourceHandle.h	2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/platform/network/ResourceHandle.h	2013-04-30 18:20:16 UTC (rev 149383)
@@ -167,6 +167,7 @@
     void sendPendingRequest();
     bool shouldUseCredentialStorage();
     bool cancelledOrClientless();
+    void ensureReadBuffer();
     static SoupSession* defaultSession();
     static uint64_t getSoupRequestInitiatingPageID(SoupRequest*);
     static void setHostAllowsAnyHTTPSCertificate(const String&);

Modified: trunk/Source/WebCore/platform/network/ResourceHandleClient.cpp (149382 => 149383)


--- trunk/Source/WebCore/platform/network/ResourceHandleClient.cpp	2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/platform/network/ResourceHandleClient.cpp	2013-04-30 18:20:16 UTC (rev 149383)
@@ -29,27 +29,14 @@
 #include "ResourceHandle.h"
 #include "SharedBuffer.h"
 
-#if USE(SOUP)
-#include <glib.h>
-#endif
-
 namespace WebCore {
 
 ResourceHandleClient::ResourceHandleClient()
-#if USE(SOUP)
-    : m_buffer(0)
-#endif
 {
 }
 
 ResourceHandleClient::~ResourceHandleClient()
 {
-#if USE(SOUP)
-    if (m_buffer) {
-        g_free(m_buffer);
-        m_buffer = 0;
-    }
-#endif
 }
 
 void ResourceHandleClient::willSendRequestAsync(ResourceHandle* handle, const ResourceRequest& request, const ResourceResponse& /*redirectResponse*/)
@@ -86,16 +73,4 @@
     didReceiveData(handle, buffer->data(), buffer->size(), encodedDataLength);
 }
 
-#if USE(SOUP)
-char* ResourceHandleClient::getBuffer(int requestedLength, int* actualLength)
-{
-    *actualLength = requestedLength;
-
-    if (!m_buffer)
-        m_buffer = static_cast<char*>(g_malloc(requestedLength));
-
-    return m_buffer;
 }
-#endif
-
-}

Modified: trunk/Source/WebCore/platform/network/ResourceHandleClient.h (149382 => 149383)


--- trunk/Source/WebCore/platform/network/ResourceHandleClient.h	2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/platform/network/ResourceHandleClient.h	2013-04-30 18:20:16 UTC (rev 149383)
@@ -99,7 +99,7 @@
 #endif
 
 #if USE(SOUP)
-        virtual char* getBuffer(int requestedLength, int* actualLength);
+        virtual char* getOrCreateReadBuffer(size_t requestedLength, size_t& actualLength) { return 0; }
 #endif
 
         virtual bool shouldUseCredentialStorage(ResourceHandle*) { return false; }
@@ -122,10 +122,6 @@
         virtual bool shouldCacheResponse(ResourceHandle*, CFCachedURLResponseRef) { return true; }
 #endif
 
-#if USE(SOUP)
-private:
-        char* m_buffer;
-#endif
     };
 
 }

Modified: trunk/Source/WebCore/platform/network/ResourceHandleInternal.h (149382 => 149383)


--- trunk/Source/WebCore/platform/network/ResourceHandleInternal.h	2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/platform/network/ResourceHandleInternal.h	2013-04-30 18:20:16 UTC (rev 149383)
@@ -48,6 +48,7 @@
 
 #if USE(SOUP)
 #include <libsoup/soup.h>
+#include <wtf/gobject/GOwnPtr.h>
 #include <wtf/gobject/GRefPtr.h>
 class Frame;
 #endif
@@ -110,8 +111,8 @@
 #endif
 #if USE(SOUP)
             , m_cancelled(false)
-            , m_buffer(0)
-            , m_bufferSize(0)
+            , m_readBufferPtr(0)
+            , m_readBufferSize(0)
             , m_bodySize(0)
             , m_bodyDataSent(0)
             , m_redirectCount(0)
@@ -198,8 +199,9 @@
         GRefPtr<GCancellable> m_cancellable;
         GRefPtr<GAsyncResult> m_deferredResult;
         GRefPtr<GSource> m_timeoutSource;
-        char* m_buffer;
-        int m_bufferSize;
+        GOwnPtr<char> m_defaultReadBuffer;
+        char* m_readBufferPtr;
+        size_t m_readBufferSize;
         unsigned long m_bodySize;
         unsigned long m_bodyDataSent;
         SoupSession* soupSession();

Modified: trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp (149382 => 149383)


--- trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp	2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp	2013-04-30 18:20:16 UTC (rev 149383)
@@ -76,8 +76,6 @@
 
 namespace WebCore {
 
-#define READ_BUFFER_SIZE 8192
-
 inline static void soupLogPrinter(SoupLogger*, SoupLoggerLogLevel, char direction, const char* data, gpointer)
 {
 #if LOG_DISABLED
@@ -304,6 +302,28 @@
     return getInternal()->m_cancelled;
 }
 
+void ResourceHandle::ensureReadBuffer()
+{
+    ResourceHandleInternal* d = getInternal();
+
+    static const size_t defaultReadBufferSize = 8192;
+    size_t bufferSize;
+    char* bufferPtr = client()->getOrCreateReadBuffer(defaultReadBufferSize, bufferSize);
+    if (bufferPtr) {
+        d->m_defaultReadBuffer.clear();
+        d->m_readBufferPtr = bufferPtr;
+        d->m_readBufferSize = bufferSize;
+    } else if (!d->m_defaultReadBuffer) {
+        d->m_defaultReadBuffer.set(static_cast<char*>(g_malloc(defaultReadBufferSize)));
+        d->m_readBufferPtr = d->m_defaultReadBuffer.get();
+        d->m_readBufferSize = defaultReadBufferSize;
+    } else
+        d->m_readBufferPtr = d->m_defaultReadBuffer.get();
+
+    ASSERT(d->m_readBufferPtr);
+    ASSERT(d->m_readBufferSize);
+}
+
 static bool isAuthenticationFailureStatusCode(int httpStatusCode)
 {
     return httpStatusCode == SOUP_STATUS_PROXY_AUTHENTICATION_REQUIRED || httpStatusCode == SOUP_STATUS_UNAUTHORIZED;
@@ -512,8 +532,8 @@
     }
 
     if (bytesSkipped > 0) {
-        d->m_buffer = handle->client()->getBuffer(READ_BUFFER_SIZE, &d->m_bufferSize);
-        g_input_stream_read_async(d->m_inputStream.get(), d->m_buffer, d->m_bufferSize, G_PRIORITY_DEFAULT,
+        handle->ensureReadBuffer();
+        g_input_stream_read_async(d->m_inputStream.get(), d->m_readBufferPtr, d->m_readBufferSize, G_PRIORITY_DEFAULT,
             d->m_cancellable.get(), redirectSkipCallback, handle.get());
         return;
     }
@@ -554,10 +574,10 @@
         d->m_soupMessage.clear();
     }
 
-    if (d->m_buffer) {
-        d->m_buffer = 0;
-        d->m_bufferSize = 0;
-    }
+    if (d->m_readBufferPtr)
+        d->m_readBufferPtr = 0;
+    if (!d->m_defaultReadBuffer)
+        d->m_readBufferSize = 0;
 
     if (d->m_timeoutSource) {
         g_source_destroy(d->m_timeoutSource.get());
@@ -627,8 +647,8 @@
         return;
     }
 
-    d->m_buffer = handle->client()->getBuffer(READ_BUFFER_SIZE, &d->m_bufferSize);
-    g_input_stream_read_async(d->m_inputStream.get(), d->m_buffer, d->m_bufferSize,
+    handle->ensureReadBuffer();
+    g_input_stream_read_async(d->m_inputStream.get(), d->m_readBufferPtr, d->m_readBufferSize,
         G_PRIORITY_DEFAULT, d->m_cancellable.get(), readCallback, handle.get());
 }
 
@@ -658,7 +678,7 @@
         return;
     }
 
-    ASSERT(!d->m_buffer);
+    ASSERT(!d->m_readBufferPtr);
 
     if (soupMessage) {
         if (SOUP_STATUS_IS_REDIRECTION(soupMessage->status_code) && shouldRedirect(handle.get())) {
@@ -666,8 +686,8 @@
             // We use read_async() rather than skip_async() to work around
             // https://bugzilla.gnome.org/show_bug.cgi?id=691489 until we can
             // depend on glib > 2.35.4
-            d->m_buffer = handle->client()->getBuffer(READ_BUFFER_SIZE, &d->m_bufferSize);
-            g_input_stream_read_async(d->m_inputStream.get(), d->m_buffer, d->m_bufferSize, G_PRIORITY_DEFAULT,
+            handle->ensureReadBuffer();
+            g_input_stream_read_async(d->m_inputStream.get(), d->m_readBufferPtr, d->m_readBufferSize, G_PRIORITY_DEFAULT,
                 d->m_cancellable.get(), redirectSkipCallback, handle.get());
             return;
         }
@@ -707,9 +727,9 @@
 
     d->m_inputStream = inputStream;
 
-    d->m_buffer = handle->client()->getBuffer(READ_BUFFER_SIZE, &d->m_bufferSize);
-    g_input_stream_read_async(d->m_inputStream.get(), d->m_buffer, d->m_bufferSize,
-                              G_PRIORITY_DEFAULT, d->m_cancellable.get(), readCallback, handle.get());
+    handle->ensureReadBuffer();
+    g_input_stream_read_async(d->m_inputStream.get(), d->m_readBufferPtr, d->m_readBufferSize,
+        G_PRIORITY_DEFAULT, d->m_cancellable.get(), readCallback, handle.get());
 }
 
 static bool addFileToSoupMessageBody(SoupMessage* message, const String& fileNameString, size_t offset, size_t lengthToSend, unsigned long& totalBodySize)
@@ -1321,7 +1341,7 @@
     // It's mandatory to have sent a response before sending data
     ASSERT(!d->m_response.isNull());
 
-    handle->client()->didReceiveData(handle.get(), d->m_buffer, bytesRead, bytesRead);
+    handle->client()->didReceiveData(handle.get(), d->m_readBufferPtr, bytesRead, bytesRead);
 
     // didReceiveData may cancel the load, which may release the last reference.
     if (handle->cancelledOrClientless()) {
@@ -1329,9 +1349,9 @@
         return;
     }
 
-    d->m_buffer = handle->client()->getBuffer(READ_BUFFER_SIZE, &d->m_bufferSize);
-    g_input_stream_read_async(d->m_inputStream.get(), d->m_buffer, d->m_bufferSize, G_PRIORITY_DEFAULT,
-                              d->m_cancellable.get(), readCallback, handle.get());
+    handle->ensureReadBuffer();
+    g_input_stream_read_async(d->m_inputStream.get(), d->m_readBufferPtr, d->m_readBufferSize, G_PRIORITY_DEFAULT,
+        d->m_cancellable.get(), readCallback, handle.get());
 }
 
 static gboolean requestTimeoutCallback(gpointer data)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to