Changeset 249000 in webkit
- Timestamp:
- Aug 22, 2019, 2:41:57 AM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
platform/mediastream/MediaStreamTrackPrivate.cpp (modified) (4 diffs)
-
platform/mediastream/MediaStreamTrackPrivate.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r248998 r249000 1 2019-08-22 Chris Dumez <cdumez@apple.com> 2 3 Fix unsafe usage of MediaStreamTrackPrivate from background thread in MediaStreamTrackPrivate::audioSamplesAvailable() 4 https://bugs.webkit.org/show_bug.cgi?id=200924 5 6 Reviewed by Youenn Fablet. 7 8 MediaStreamTrackPrivate is constructed / destructed on the main thread but its MediaStreamTrackPrivate::audioSamplesAvailable() 9 gets called on a background thread. The audioSamplesAvailable() method may get called until the MediaStreamTrackPrivate 10 destructor unregisters |this| as an observer from m_source. Event though MediaStreamTrackPrivate subclasses ThreadSafeRefCounted, 11 ref'ing |this| on the background thread inside audioSamplesAvailable() is still unsafe as the destructor may already be running 12 on the main thread. 13 14 * platform/mediastream/MediaStreamTrackPrivate.cpp: 15 (WebCore::MediaStreamTrackPrivate::MediaStreamTrackPrivate): 16 (WebCore::MediaStreamTrackPrivate::~MediaStreamTrackPrivate): 17 (WebCore::MediaStreamTrackPrivate::audioSamplesAvailable): 18 * platform/mediastream/MediaStreamTrackPrivate.h: 19 1 20 2019-08-22 Fujii Hironori <Hironori.Fujii@sony.com> 2 21 -
trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp
r247452 r249000 57 57 58 58 MediaStreamTrackPrivate::MediaStreamTrackPrivate(Ref<const Logger>&& logger, Ref<RealtimeMediaSource>&& source, String&& id) 59 : m_source(WTFMove(source)) 59 : m_weakThis(makeWeakPtr(*this)) 60 , m_source(WTFMove(source)) 60 61 , m_id(WTFMove(id)) 61 62 , m_logger(WTFMove(logger)) … … 64 65 #endif 65 66 { 67 ASSERT(isMainThread()); 66 68 UNUSED_PARAM(logger); 67 69 #if !RELEASE_LOG_DISABLED … … 73 75 MediaStreamTrackPrivate::~MediaStreamTrackPrivate() 74 76 { 77 ASSERT(isMainThread()); 75 78 m_source->removeObserver(*this); 76 79 } … … 263 266 { 264 267 if (!m_hasSentStartProducedData) { 265 callOnMainThread([this, protectedThis = makeRef(*this)] { 268 callOnMainThread([this, weakThis = m_weakThis] { 269 if (!weakThis) 270 return; 271 266 272 if (!m_haveProducedData) { 267 273 m_haveProducedData = true; -
trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h
r247211 r249000 32 32 #include "RealtimeMediaSource.h" 33 33 #include <wtf/LoggerHelper.h> 34 #include <wtf/WeakPtr.h> 34 35 35 36 namespace WebCore { … … 43 44 class MediaStreamTrackPrivate final 44 45 : public ThreadSafeRefCounted<MediaStreamTrackPrivate, WTF::DestructionThread::Main> 46 , public CanMakeWeakPtr<MediaStreamTrackPrivate> 45 47 , public RealtimeMediaSource::Observer 46 48 #if !RELEASE_LOG_DISABLED … … 143 145 #endif 144 146 147 WeakPtr<MediaStreamTrackPrivate> m_weakThis; 145 148 mutable RecursiveLock m_observersLock; 146 149 HashSet<Observer*> m_observers;
Note:
See TracChangeset
for help on using the changeset viewer.