Changeset 278309 in webkit
- Timestamp:
- Jun 1, 2021, 8:34:54 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
Modules/webaudio/MediaStreamAudioSourceNode.cpp (modified) (4 diffs)
-
Modules/webaudio/MediaStreamAudioSourceNode.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r278307 r278309 1 2021-06-01 Chris Dumez <cdumez@apple.com> 2 3 Fix thread safety issues in MediaStreamAudioSourceNode 4 https://bugs.webkit.org/show_bug.cgi?id=226476 5 6 Reviewed by Youenn Fablet. 7 8 Adopt thread safety analysis annotations in MediaStreamAudioSourceNode and fix 9 bugs found by clang. In particular, the following issues were fixed: 10 - setFormat() could modify m_sourceNumberOfChannels before locking on the main 11 thread. 12 - process() was accessing m_sourceNumberOfChannels / m_sourceSampleRate 13 on the rendering thread *before* locking. 14 15 * Modules/webaudio/MediaStreamAudioSourceNode.cpp: 16 (WebCore::MediaStreamAudioSourceNode::setFormat): 17 (WebCore::MediaStreamAudioSourceNode::process): 18 * Modules/webaudio/MediaStreamAudioSourceNode.h: 19 1 20 2021-06-01 Chris Dumez <cdumez@apple.com> 2 21 -
trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.cpp
r277932 r278309 90 90 void MediaStreamAudioSourceNode::setFormat(size_t numberOfChannels, float sourceSampleRate) 91 91 { 92 float sampleRate = this->sampleRate(); 92 // Synchronize with process(). 93 Locker locker { m_processLock }; 94 93 95 if (numberOfChannels == m_sourceNumberOfChannels && sourceSampleRate == m_sourceSampleRate) 94 96 return; … … 102 104 } 103 105 104 // Synchronize with process().105 Locker locker { m_processLock };106 107 106 m_sourceNumberOfChannels = numberOfChannels; 108 107 m_sourceSampleRate = sourceSampleRate; 109 108 109 float sampleRate = this->sampleRate(); 110 110 if (sourceSampleRate == sampleRate) 111 111 m_multiChannelResampler = nullptr; … … 135 135 AudioBus* outputBus = output(0)->bus(); 136 136 137 if (!mediaStream() || !m_sourceNumberOfChannels || !m_sourceSampleRate) {138 outputBus->zero();139 return;140 }141 142 137 // Use tryLock() to avoid contention in the real-time audio thread. 143 138 // If we fail to acquire the lock then the MediaStream must be in the middle of … … 149 144 } 150 145 Locker locker { AdoptLock, m_processLock }; 151 if (m_sourceNumberOfChannels != outputBus->numberOfChannels()) { 146 147 if (!m_sourceNumberOfChannels || !m_sourceSampleRate || m_sourceNumberOfChannels != outputBus->numberOfChannels()) { 152 148 outputBus->zero(); 153 149 return; -
trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.h
r271575 r278309 47 47 ~MediaStreamAudioSourceNode(); 48 48 49 MediaStream * mediaStream() { return &m_mediaStream.get(); }49 MediaStream& mediaStream() { return m_mediaStream; } 50 50 51 51 private: … … 68 68 Ref<MediaStream> m_mediaStream; 69 69 Ref<WebAudioSourceProvider> m_provider; 70 std::unique_ptr<MultiChannelResampler> m_multiChannelResampler ;70 std::unique_ptr<MultiChannelResampler> m_multiChannelResampler WTF_GUARDED_BY_LOCK(m_processLock); 71 71 72 72 Lock m_processLock; 73 73 74 unsigned m_sourceNumberOfChannels { 0 };75 double m_sourceSampleRate { 0 };74 unsigned m_sourceNumberOfChannels WTF_GUARDED_BY_LOCK(m_processLock) { 0 }; 75 double m_sourceSampleRate WTF_GUARDED_BY_LOCK(m_processLock) { 0 }; 76 76 }; 77 77
Note:
See TracChangeset
for help on using the changeset viewer.