Changeset 62955 in webkit


Ignore:
Timestamp:
Jul 9, 2010 8:26:16 AM (14 years ago)
Author:
commit-queue@webkit.org
Message:

2010-07-09 Sebastian Dröge <sebastian.droege@collabora.co.uk>

Reviewed by Gustavo Noronha Silva.

Bug 41340 - [GStreamer] Subtle race condition during seeks
https://bugs.webkit.org/show_bug.cgi?id=41340

  • platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp: (webKitWebSrcStop): (webKitWebSrcNeedDataMainCb): (webKitWebSrcNeedDataCb): (webKitWebSrcEnoughDataMainCb): (webKitWebSrcEnoughDataCb): (webKitWebSrcSeekDataCb): (StreamingClient::didFinishLoading): Fix two subtle race conditions that can happen during seeks:
  • The timeout callback could be called before the callback ID is assigned to the instance private data. This causes the ID to be set after the callback has finished and breaks all future processing.
  • The source must not go EOS while a seek is pending because this confuses appsrc due to the different threads involved here.
Location:
trunk/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r62954 r62955  
     12010-07-09  Sebastian Dröge  <sebastian.droege@collabora.co.uk>
     2
     3        Reviewed by Gustavo Noronha Silva.
     4
     5        Bug 41340 - [GStreamer] Subtle race condition during seeks
     6        https://bugs.webkit.org/show_bug.cgi?id=41340
     7
     8        * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
     9        (webKitWebSrcStop):
     10        (webKitWebSrcNeedDataMainCb):
     11        (webKitWebSrcNeedDataCb):
     12        (webKitWebSrcEnoughDataMainCb):
     13        (webKitWebSrcEnoughDataCb):
     14        (webKitWebSrcSeekDataCb):
     15        (StreamingClient::didFinishLoading):
     16        Fix two subtle race conditions that can happen during seeks:
     17        - The timeout callback could be called before the callback ID is
     18          assigned to the instance private data. This causes the ID to
     19          be set after the callback has finished and breaks all future
     20          processing.
     21        - The source must not go EOS while a seek is pending because
     22          this confuses appsrc due to the different threads involved here.
     23
    1242010-07-09  Simon Hausmann  <simon.hausmann@nokia.com>
    225
  • trunk/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp

    r60219 r62955  
    331331        priv->frame.release();
    332332
     333    GST_OBJECT_LOCK(src);
    333334    if (priv->needDataID)
    334335        g_source_remove(priv->needDataID);
     
    344345
    345346    priv->paused = FALSE;
     347    GST_OBJECT_UNLOCK(src);
    346348
    347349    g_free(priv->iradioName);
     
    543545    // underlying network implementation here.
    544546
     547    GST_OBJECT_LOCK(src);
    545548    priv->paused = FALSE;
    546549    priv->needDataID = 0;
     550    GST_OBJECT_UNLOCK(src);
    547551    return FALSE;
    548552}
     
    554558
    555559    GST_DEBUG_OBJECT(src, "Need more data: %u", length);
    556     if (priv->needDataID || !priv->paused)
     560
     561    GST_OBJECT_LOCK(src);
     562    if (priv->needDataID || !priv->paused) {
     563        GST_OBJECT_UNLOCK(src);
    557564        return;
     565    }
    558566
    559567    priv->needDataID = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitWebSrcNeedDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
     568    GST_OBJECT_UNLOCK(src);
    560569}
    561570
     
    571580    // underlying network implementation here.
    572581
     582    GST_OBJECT_LOCK(src);
    573583    priv->paused = TRUE;
    574584    priv->enoughDataID = 0;
     585    GST_OBJECT_UNLOCK(src);
     586
    575587    return FALSE;
    576588}
     
    582594
    583595    GST_DEBUG_OBJECT(src, "Have enough data");
    584     if (priv->enoughDataID || priv->paused)
     596
     597    GST_OBJECT_LOCK(src);
     598    if (priv->enoughDataID || priv->paused) {
     599        GST_OBJECT_UNLOCK(src);
    585600        return;
     601    }
    586602
    587603    priv->enoughDataID = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitWebSrcEnoughDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
     604    GST_OBJECT_UNLOCK(src);
    588605}
    589606
     
    612629    GST_DEBUG_OBJECT(src, "Doing range-request seek");
    613630    priv->requestedOffset = offset;
     631
     632    GST_OBJECT_LOCK(src);
    614633    if (priv->seekID)
    615634        g_source_remove(priv->seekID);
    616635    priv->seekID = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitWebSrcSeekMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
     636    GST_OBJECT_UNLOCK(src);
    617637   
    618638    return TRUE;
     
    744764void StreamingClient::didFinishLoading(ResourceHandle*)
    745765{
     766    WebKitWebSrcPrivate* priv = m_src->priv;
     767
    746768    GST_DEBUG_OBJECT(m_src, "Have EOS");
    747     gst_app_src_end_of_stream(m_src->priv->appsrc);
     769
     770    if (!priv->seekID)
     771        gst_app_src_end_of_stream(m_src->priv->appsrc);
    748772}
    749773
Note: See TracChangeset for help on using the changeset viewer.