⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 278309 in webkit


Ignore:
Timestamp:
Jun 1, 2021, 8:34:54 AM (5 years ago)
Author:
Chris Dumez
Message:

Fix thread safety issues in MediaStreamAudioSourceNode
https://bugs.webkit.org/show_bug.cgi?id=226476

Reviewed by Youenn Fablet.

Adopt thread safety analysis annotations in MediaStreamAudioSourceNode and fix
bugs found by clang. In particular, the following issues were fixed:

  • setFormat() could modify m_sourceNumberOfChannels before locking on the main thread.
  • process() was accessing m_sourceNumberOfChannels / m_sourceSampleRate on the rendering thread *before* locking.
  • Modules/webaudio/MediaStreamAudioSourceNode.cpp:

(WebCore::MediaStreamAudioSourceNode::setFormat):
(WebCore::MediaStreamAudioSourceNode::process):

  • Modules/webaudio/MediaStreamAudioSourceNode.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r278307 r278309  
     12021-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
    1202021-06-01  Chris Dumez  <cdumez@apple.com>
    221
  • trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.cpp

    r277932 r278309  
    9090void MediaStreamAudioSourceNode::setFormat(size_t numberOfChannels, float sourceSampleRate)
    9191{
    92     float sampleRate = this->sampleRate();
     92    // Synchronize with process().
     93    Locker locker { m_processLock };
     94
    9395    if (numberOfChannels == m_sourceNumberOfChannels && sourceSampleRate == m_sourceSampleRate)
    9496        return;
     
    102104    }
    103105
    104     // Synchronize with process().
    105     Locker locker { m_processLock };
    106 
    107106    m_sourceNumberOfChannels = numberOfChannels;
    108107    m_sourceSampleRate = sourceSampleRate;
    109108
     109    float sampleRate = this->sampleRate();
    110110    if (sourceSampleRate == sampleRate)
    111111        m_multiChannelResampler = nullptr;
     
    135135    AudioBus* outputBus = output(0)->bus();
    136136
    137     if (!mediaStream() || !m_sourceNumberOfChannels || !m_sourceSampleRate) {
    138         outputBus->zero();
    139         return;
    140     }
    141 
    142137    // Use tryLock() to avoid contention in the real-time audio thread.
    143138    // If we fail to acquire the lock then the MediaStream must be in the middle of
     
    149144    }
    150145    Locker locker { AdoptLock, m_processLock };
    151     if (m_sourceNumberOfChannels != outputBus->numberOfChannels()) {
     146
     147    if (!m_sourceNumberOfChannels || !m_sourceSampleRate || m_sourceNumberOfChannels != outputBus->numberOfChannels()) {
    152148        outputBus->zero();
    153149        return;
  • trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.h

    r271575 r278309  
    4747    ~MediaStreamAudioSourceNode();
    4848
    49     MediaStream* mediaStream() { return &m_mediaStream.get(); }
     49    MediaStream& mediaStream() { return m_mediaStream; }
    5050
    5151private:
     
    6868    Ref<MediaStream> m_mediaStream;
    6969    Ref<WebAudioSourceProvider> m_provider;
    70     std::unique_ptr<MultiChannelResampler> m_multiChannelResampler;
     70    std::unique_ptr<MultiChannelResampler> m_multiChannelResampler WTF_GUARDED_BY_LOCK(m_processLock);
    7171
    7272    Lock m_processLock;
    7373
    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 };
    7676};
    7777
Note: See TracChangeset for help on using the changeset viewer.