Changeset 247292 in webkit


Ignore:
Timestamp:
Jul 9, 2019 9:19:48 PM (5 years ago)
Author:
Chris Dumez
Message:

Stop using GenericTaskQueue from multiple threads
https://bugs.webkit.org/show_bug.cgi?id=199652

Reviewed by Geoffrey Garen.

WebCoreAVFLoaderDelegate was calling GenericTaskQueue::enqueueTask() from a background thread,
which is not safe because the implementation of enqueueTask() calls makeWeakPtr() on the
GenericTaskQueue (a main thread object).

Update WebCoreAVFLoaderDelegate to use callOnMainThread() instead.

  • platform/GenericTaskQueue.h:

Stop last template parameter which was used exclusively by WebCoreAVFLoaderDelegate to try and
make GenericTaskQueue thread-safe.

  • platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:

(-[WebCoreAVFMovieObserver metadataLoaded]):
(-[WebCoreAVFMovieObserver didEnd:]):
(-[WebCoreAVFMovieObserver observeValueForKeyPath:ofObject:change:context:]):
(-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]):
(-[WebCoreAVFMovieObserver outputSequenceWasFlushed:]):
(-[WebCoreAVFLoaderDelegate resourceLoader:shouldWaitForLoadingOfRequestedResource:]):
(-[WebCoreAVFLoaderDelegate resourceLoader:didCancelLoadingRequest:]):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r247291 r247292  
     12019-07-09  Chris Dumez  <cdumez@apple.com>
     2
     3        Stop using GenericTaskQueue from multiple threads
     4        https://bugs.webkit.org/show_bug.cgi?id=199652
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        WebCoreAVFLoaderDelegate was calling GenericTaskQueue::enqueueTask() from a background thread,
     9        which is not safe because the implementation of enqueueTask() calls makeWeakPtr() on the
     10        GenericTaskQueue (a main thread object).
     11
     12        Update WebCoreAVFLoaderDelegate to use callOnMainThread() instead.
     13
     14        * platform/GenericTaskQueue.h:
     15        Stop last template parameter which was used exclusively by WebCoreAVFLoaderDelegate to try and
     16        make GenericTaskQueue thread-safe.
     17
     18        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
     19        (-[WebCoreAVFMovieObserver metadataLoaded]):
     20        (-[WebCoreAVFMovieObserver didEnd:]):
     21        (-[WebCoreAVFMovieObserver observeValueForKeyPath:ofObject:change:context:]):
     22        (-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]):
     23        (-[WebCoreAVFMovieObserver outputSequenceWasFlushed:]):
     24        (-[WebCoreAVFLoaderDelegate resourceLoader:shouldWaitForLoadingOfRequestedResource:]):
     25        (-[WebCoreAVFLoaderDelegate resourceLoader:didCancelLoadingRequest:]):
     26
    1272019-07-09  Tim Horton  <timothy_horton@apple.com>
    228
  • trunk/Source/WebCore/platform/GenericTaskQueue.h

    r237378 r247292  
    7272};
    7373
    74 template <typename T, typename C = unsigned>
    75 class GenericTaskQueue : public CanMakeWeakPtr<GenericTaskQueue<T, C>> {
     74template <typename T>
     75class GenericTaskQueue : public CanMakeWeakPtr<GenericTaskQueue<T>> {
    7676public:
    7777    GenericTaskQueue()
     
    125125private:
    126126    TaskDispatcher<T> m_dispatcher;
    127     C m_pendingTasks { 0 };
     127    unsigned m_pendingTasks { 0 };
    128128    bool m_isClosed { false };
    129129};
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm

    r246892 r247292  
    170170{
    171171    WeakPtr<MediaPlayerPrivateAVFoundationObjC> m_player;
    172     GenericTaskQueue<Timer, std::atomic<unsigned>> m_taskQueue;
    173172    int m_delayCallbacks;
    174173}
     
    185184@interface WebCoreAVFLoaderDelegate : NSObject<AVAssetResourceLoaderDelegate> {
    186185    WeakPtr<MediaPlayerPrivateAVFoundationObjC> m_player;
    187     GenericTaskQueue<Timer, std::atomic<unsigned>> m_taskQueue;
    188186}
    189187- (id)initWithPlayer:(WeakPtr<MediaPlayerPrivateAVFoundationObjC>&&)player;
     
    32883286- (void)metadataLoaded
    32893287{
    3290     m_taskQueue.enqueueTask([player = m_player] {
     3288    callOnMainThread([player = m_player] {
    32913289        if (player)
    32923290            player->metadataLoaded();
     
    32973295{
    32983296    UNUSED_PARAM(unusedNotification);
    3299     m_taskQueue.enqueueTask([player = m_player] {
     3297    callOnMainThread([player = m_player] {
    33003298        if (player)
    33013299            player->didEnd();
     
    33053303- (void)observeValueForKeyPath:keyPath ofObject:(id)object change:(NSDictionary *)change context:(MediaPlayerAVFoundationObservationContext)context
    33063304{
    3307     m_taskQueue.enqueueTask([player = m_player, keyPath = retainPtr(keyPath), change = retainPtr(change), object = retainPtr(object), context] {
     3305    callOnMainThread([player = m_player, keyPath = retainPtr(keyPath), change = retainPtr(change), object = retainPtr(object), context] {
    33083306        if (!player)
    33093307            return;
     
    34083406    UNUSED_PARAM(output);
    34093407
    3410     m_taskQueue.enqueueTask([player = m_player, strings = retainPtr(strings), nativeSamples = retainPtr(nativeSamples), itemTime] {
     3408    callOnMainThread([player = m_player, strings = retainPtr(strings), nativeSamples = retainPtr(nativeSamples), itemTime] {
    34113409        if (!player)
    34123410            return;
     
    34203418    UNUSED_PARAM(output);
    34213419
    3422     m_taskQueue.enqueueTask([player = m_player] {
     3420    callOnMainThread([player = m_player] {
    34233421        if (player)
    34243422            player->flushCues();
     
    34473445        return NO;
    34483446
    3449     m_taskQueue.enqueueTask([player = m_player, loadingRequest = retainPtr(loadingRequest)] {
     3447    callOnMainThread([player = m_player, loadingRequest = retainPtr(loadingRequest)] {
    34503448        if (!player) {
    34513449            [loadingRequest finishLoadingWithError:nil];
     
    34713469{
    34723470    UNUSED_PARAM(resourceLoader);
    3473     m_taskQueue.enqueueTask([player = m_player, loadingRequest = retainPtr(loadingRequest)] {
     3471    callOnMainThread([player = m_player, loadingRequest = retainPtr(loadingRequest)] {
    34743472        if (player)
    34753473            player->didCancelLoadingRequest(loadingRequest.get());
Note: See TracChangeset for help on using the changeset viewer.