Changeset 247292 in webkit
- Timestamp:
- Jul 9, 2019 9:19:48 PM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r247291 r247292 1 2019-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 1 27 2019-07-09 Tim Horton <timothy_horton@apple.com> 2 28 -
trunk/Source/WebCore/platform/GenericTaskQueue.h
r237378 r247292 72 72 }; 73 73 74 template <typename T , typename C = unsigned>75 class GenericTaskQueue : public CanMakeWeakPtr<GenericTaskQueue<T , C>> {74 template <typename T> 75 class GenericTaskQueue : public CanMakeWeakPtr<GenericTaskQueue<T>> { 76 76 public: 77 77 GenericTaskQueue() … … 125 125 private: 126 126 TaskDispatcher<T> m_dispatcher; 127 Cm_pendingTasks { 0 };127 unsigned m_pendingTasks { 0 }; 128 128 bool m_isClosed { false }; 129 129 }; -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm
r246892 r247292 170 170 { 171 171 WeakPtr<MediaPlayerPrivateAVFoundationObjC> m_player; 172 GenericTaskQueue<Timer, std::atomic<unsigned>> m_taskQueue;173 172 int m_delayCallbacks; 174 173 } … … 185 184 @interface WebCoreAVFLoaderDelegate : NSObject<AVAssetResourceLoaderDelegate> { 186 185 WeakPtr<MediaPlayerPrivateAVFoundationObjC> m_player; 187 GenericTaskQueue<Timer, std::atomic<unsigned>> m_taskQueue;188 186 } 189 187 - (id)initWithPlayer:(WeakPtr<MediaPlayerPrivateAVFoundationObjC>&&)player; … … 3288 3286 - (void)metadataLoaded 3289 3287 { 3290 m_taskQueue.enqueueTask([player = m_player] {3288 callOnMainThread([player = m_player] { 3291 3289 if (player) 3292 3290 player->metadataLoaded(); … … 3297 3295 { 3298 3296 UNUSED_PARAM(unusedNotification); 3299 m_taskQueue.enqueueTask([player = m_player] {3297 callOnMainThread([player = m_player] { 3300 3298 if (player) 3301 3299 player->didEnd(); … … 3305 3303 - (void)observeValueForKeyPath:keyPath ofObject:(id)object change:(NSDictionary *)change context:(MediaPlayerAVFoundationObservationContext)context 3306 3304 { 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] { 3308 3306 if (!player) 3309 3307 return; … … 3408 3406 UNUSED_PARAM(output); 3409 3407 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] { 3411 3409 if (!player) 3412 3410 return; … … 3420 3418 UNUSED_PARAM(output); 3421 3419 3422 m_taskQueue.enqueueTask([player = m_player] {3420 callOnMainThread([player = m_player] { 3423 3421 if (player) 3424 3422 player->flushCues(); … … 3447 3445 return NO; 3448 3446 3449 m_taskQueue.enqueueTask([player = m_player, loadingRequest = retainPtr(loadingRequest)] {3447 callOnMainThread([player = m_player, loadingRequest = retainPtr(loadingRequest)] { 3450 3448 if (!player) { 3451 3449 [loadingRequest finishLoadingWithError:nil]; … … 3471 3469 { 3472 3470 UNUSED_PARAM(resourceLoader); 3473 m_taskQueue.enqueueTask([player = m_player, loadingRequest = retainPtr(loadingRequest)] {3471 callOnMainThread([player = m_player, loadingRequest = retainPtr(loadingRequest)] { 3474 3472 if (player) 3475 3473 player->didCancelLoadingRequest(loadingRequest.get());
Note: See TracChangeset
for help on using the changeset viewer.