Changeset 62955 in webkit
- Timestamp:
- Jul 9, 2010 8:26:16 AM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r62954 r62955 1 2010-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 1 24 2010-07-09 Simon Hausmann <simon.hausmann@nokia.com> 2 25 -
trunk/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp
r60219 r62955 331 331 priv->frame.release(); 332 332 333 GST_OBJECT_LOCK(src); 333 334 if (priv->needDataID) 334 335 g_source_remove(priv->needDataID); … … 344 345 345 346 priv->paused = FALSE; 347 GST_OBJECT_UNLOCK(src); 346 348 347 349 g_free(priv->iradioName); … … 543 545 // underlying network implementation here. 544 546 547 GST_OBJECT_LOCK(src); 545 548 priv->paused = FALSE; 546 549 priv->needDataID = 0; 550 GST_OBJECT_UNLOCK(src); 547 551 return FALSE; 548 552 } … … 554 558 555 559 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); 557 564 return; 565 } 558 566 559 567 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); 560 569 } 561 570 … … 571 580 // underlying network implementation here. 572 581 582 GST_OBJECT_LOCK(src); 573 583 priv->paused = TRUE; 574 584 priv->enoughDataID = 0; 585 GST_OBJECT_UNLOCK(src); 586 575 587 return FALSE; 576 588 } … … 582 594 583 595 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); 585 600 return; 601 } 586 602 587 603 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); 588 605 } 589 606 … … 612 629 GST_DEBUG_OBJECT(src, "Doing range-request seek"); 613 630 priv->requestedOffset = offset; 631 632 GST_OBJECT_LOCK(src); 614 633 if (priv->seekID) 615 634 g_source_remove(priv->seekID); 616 635 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); 617 637 618 638 return TRUE; … … 744 764 void StreamingClient::didFinishLoading(ResourceHandle*) 745 765 { 766 WebKitWebSrcPrivate* priv = m_src->priv; 767 746 768 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); 748 772 } 749 773
Note: See TracChangeset
for help on using the changeset viewer.