Changeset 211372 in webkit


Ignore:
Timestamp:
Jan 30, 2017 10:13:11 AM (7 years ago)
Author:
Carlos Garcia Campos
Message:

REGRESSION(r202615?): [GStreamer] ASSERTION FAILED: isMainThread() in WebCore::BuiltinResourceHandleConstructorMap& WebCore::builtinResourceHandleConstructorMap()
https://bugs.webkit.org/show_bug.cgi?id=167003

Reviewed by Michael Catanzaro.

Add a way to create a ResourceHandle for a given SoupNetworkSession and use it in the GStreamer streaming client
to ensure both the session and the handle are created and destroyed in the secondary thread. This way we also
avoid using the default session for downloading HLS fragments.

  • platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:

(ResourceHandleStreamingClient::ResourceHandleStreamingClient): Create a SoupNetworkSession and pass it to ResourceHandle::create().

  • platform/network/ResourceHandle.h: Add create and constructor to receive a SoupNetworkSession.
  • platform/network/ResourceHandleInternal.h: Add SoupNetworkSession member.
  • platform/network/soup/ResourceHandleSoup.cpp:

(WebCore::ResourceHandleInternal::soupSession): Return the SoupNetworkSession if not nullptr.
(WebCore::ResourceHandle::create): Create a ResourceHandle without trying to use any builtin constructor and
using the given SoupNetworkSession.
(WebCore::ResourceHandle::ResourceHandle): Set the SoupNetworkSession if early request validations didn't fail.

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r211371 r211372  
     12017-01-30  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        REGRESSION(r202615?): [GStreamer] ASSERTION FAILED: isMainThread() in WebCore::BuiltinResourceHandleConstructorMap& WebCore::builtinResourceHandleConstructorMap()
     4        https://bugs.webkit.org/show_bug.cgi?id=167003
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        Add a way to create a ResourceHandle for a given SoupNetworkSession and use it in the GStreamer streaming client
     9        to ensure both the session and the handle are created and destroyed in the secondary thread. This way we also
     10        avoid using the default session for downloading HLS fragments.
     11
     12        * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
     13        (ResourceHandleStreamingClient::ResourceHandleStreamingClient): Create a SoupNetworkSession and pass it to ResourceHandle::create().
     14        * platform/network/ResourceHandle.h: Add create and constructor to receive a SoupNetworkSession.
     15        * platform/network/ResourceHandleInternal.h: Add SoupNetworkSession member.
     16        * platform/network/soup/ResourceHandleSoup.cpp:
     17        (WebCore::ResourceHandleInternal::soupSession): Return the SoupNetworkSession if not nullptr.
     18        (WebCore::ResourceHandle::create): Create a ResourceHandle without trying to use any builtin constructor and
     19        using the given SoupNetworkSession.
     20        (WebCore::ResourceHandle::ResourceHandle): Set the SoupNetworkSession if early request validations didn't fail.
     21
    1222017-01-30  Youenn Fablet  <youennf@gmail.com>
    223
  • trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp

    r210584 r211372  
    4747#include <wtf/text/CString.h>
    4848
     49#if USE(SOUP)
     50#include "SoupNetworkSession.h"
     51#endif
     52
    4953using namespace WebCore;
    5054
     
    112116        Condition m_terminateRunLoopCondition;
    113117        RefPtr<ResourceHandle> m_resource;
     118#if USE(SOUP)
     119        std::unique_ptr<SoupNetworkSession> m_session;
     120#endif
    114121};
    115122
     
    10721079            LockHolder locker(m_initializeRunLoopConditionMutex);
    10731080            m_runLoop = &RunLoop::current();
     1081#if USE(SOUP)
     1082            m_session = std::make_unique<SoupNetworkSession>();
     1083            m_resource = ResourceHandle::create(*m_session, request, this, true, false);
     1084#else
     1085            // FIXME: This create will hit an assert in debug builds. See https://bugs.webkit.org/show_bug.cgi?id=167003.
    10741086            m_resource = ResourceHandle::create(nullptr /*context*/, request, this, true, false);
     1087#endif
    10751088            m_initializeRunLoopCondition.notifyOne();
    10761089        }
     
    10861099            m_resource->cancel();
    10871100            m_resource = nullptr;
     1101#if USE(SOUP)
     1102            m_session = nullptr;
     1103#endif
    10881104            m_terminateRunLoopCondition.notifyOne();
    10891105        }
  • trunk/Source/WebCore/platform/network/ResourceHandle.h

    r210480 r211372  
    8787class ResourceRequest;
    8888class ResourceResponse;
     89class SoupNetworkSession;
    8990class SharedBuffer;
    9091class Timer;
     
    9495    WEBCORE_EXPORT static RefPtr<ResourceHandle> create(NetworkingContext*, const ResourceRequest&, ResourceHandleClient*, bool defersLoading, bool shouldContentSniff);
    9596    WEBCORE_EXPORT static void loadResourceSynchronously(NetworkingContext*, const ResourceRequest&, StoredCredentials, ResourceError&, ResourceResponse&, Vector<char>& data);
     97
     98#if USE(SOUP)
     99    static RefPtr<ResourceHandle> create(SoupNetworkSession&, const ResourceRequest&, ResourceHandleClient*, bool defersLoading, bool shouldContentSniff);
     100#endif
    96101
    97102    WEBCORE_EXPORT virtual ~ResourceHandle();
     
    242247    };
    243248
     249#if USE(SOUP)
     250    ResourceHandle(SoupNetworkSession&, const ResourceRequest&, ResourceHandleClient*, bool defersLoading, bool shouldContentSniff);
     251#endif
     252
    244253    void platformSetDefersLoading(bool);
    245254
  • trunk/Source/WebCore/platform/network/ResourceHandleInternal.h

    r210681 r211372  
    5151#if USE(SOUP)
    5252#include "GUniquePtrSoup.h"
     53#include "SoupNetworkSession.h"
    5354#include <libsoup/soup.h>
    5455#include <wtf/RunLoop.h>
     
    150151#endif
    151152#if USE(SOUP)
     153    SoupNetworkSession* m_session { nullptr };
    152154    GRefPtr<SoupMessage> m_soupMessage;
    153155    ResourceResponse m_response;
  • trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp

    r210786 r211372  
    9292SoupSession* ResourceHandleInternal::soupSession()
    9393{
    94     return sessionFromContext(m_context.get());
     94    return m_session ? m_session->soupSession() : sessionFromContext(m_context.get());
     95}
     96
     97RefPtr<ResourceHandle> ResourceHandle::create(SoupNetworkSession& session, const ResourceRequest& request, ResourceHandleClient* client, bool defersLoading, bool shouldContentSniff)
     98{
     99    auto newHandle = adoptRef(*new ResourceHandle(session, request, client, defersLoading, shouldContentSniff));
     100
     101    if (newHandle->d->m_scheduledFailureType != NoFailure)
     102        return WTFMove(newHandle);
     103
     104    if (newHandle->start())
     105        return WTFMove(newHandle);
     106
     107    return nullptr;
     108}
     109
     110ResourceHandle::ResourceHandle(SoupNetworkSession& session, const ResourceRequest& request, ResourceHandleClient* client, bool defersLoading, bool shouldContentSniff)
     111    : d(std::make_unique<ResourceHandleInternal>(this, nullptr, request, client, defersLoading, shouldContentSniff && shouldContentSniffURL(request.url())))
     112{
     113    if (!request.url().isValid()) {
     114        scheduleFailure(InvalidURLFailure);
     115        return;
     116    }
     117
     118    if (!portAllowed(request.url())) {
     119        scheduleFailure(BlockedFailure);
     120        return;
     121    }
     122
     123    d->m_session = &session;
    95124}
    96125
Note: See TracChangeset for help on using the changeset viewer.