Diff
Modified: trunk/Source/WTF/ChangeLog (277874 => 277875)
--- trunk/Source/WTF/ChangeLog 2021-05-21 19:04:39 UTC (rev 277874)
+++ trunk/Source/WTF/ChangeLog 2021-05-21 19:24:05 UTC (rev 277875)
@@ -1,3 +1,21 @@
+2021-05-21 Chris Dumez <cdu...@apple.com>
+
+ Use CheckedLock more in cases where we try-lock
+ https://bugs.webkit.org/show_bug.cgi?id=226056
+
+ Reviewed by Alex Christensen.
+
+ Use CheckedLock more in cases where we try-lock to benefit from Clang
+ Thread Safety Analysis.
+
+ * wtf/Logger.cpp:
+ * wtf/Logger.h:
+ (WTF::Logger::addObserver):
+ (WTF::Logger::removeObserver):
+ (WTF::Logger::log):
+ (WTF::Logger::logVerbose):
+ (WTF::Logger::WTF_RETURNS_LOCK):
+
2021-05-20 Chris Dumez <cdu...@apple.com>
Use CheckedLock more in WTF
Modified: trunk/Source/WTF/wtf/Logger.cpp (277874 => 277875)
--- trunk/Source/WTF/wtf/Logger.cpp 2021-05-21 19:04:39 UTC (rev 277874)
+++ trunk/Source/WTF/wtf/Logger.cpp 2021-05-21 19:24:05 UTC (rev 277875)
@@ -32,7 +32,7 @@
namespace WTF {
-Lock loggerObserverLock;
+CheckedLock loggerObserverLock;
String Logger::LogSiteIdentifier::toString() const
{
Modified: trunk/Source/WTF/wtf/Logger.h (277874 => 277875)
--- trunk/Source/WTF/wtf/Logger.h 2021-05-21 19:04:39 UTC (rev 277874)
+++ trunk/Source/WTF/wtf/Logger.h 2021-05-21 19:24:05 UTC (rev 277875)
@@ -25,7 +25,7 @@
#pragma once
-#include <wtf/Lock.h>
+#include <wtf/CheckedLock.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/text/StringBuilder.h>
@@ -112,7 +112,7 @@
}
};
-WTF_EXPORT_PRIVATE extern Lock loggerObserverLock;
+WTF_EXPORT_PRIVATE extern CheckedLock loggerObserverLock;
class Logger : public ThreadSafeRefCounted<Logger> {
WTF_MAKE_NONCOPYABLE(Logger);
@@ -285,12 +285,12 @@
static inline void addObserver(Observer& observer)
{
- auto lock = holdLock(observerLock());
+ Locker locker { observerLock() };
observers().append(observer);
}
static inline void removeObserver(Observer& observer)
{
- auto lock = holdLock(observerLock());
+ Locker locker { observerLock() };
observers().removeFirstMatching([&observer](auto anObserver) {
return &anObserver.get() == &observer;
});
@@ -322,10 +322,10 @@
if (channel.state == WTFLogChannelState::Off || level > channel.level)
return;
- auto lock = tryHoldLock(observerLock());
- if (!lock)
+ if (!observerLock().tryLock())
return;
+ Locker locker { AdoptLockTag { }, observerLock() };
for (Observer& observer : observers())
observer.didLogMessage(channel, level, { ConsoleLogValue<Argument>::toValue(arguments)... });
}
@@ -353,17 +353,17 @@
if (channel.state == WTFLogChannelState::Off || level > channel.level)
return;
- auto lock = tryHoldLock(observerLock());
- if (!lock)
+ if (!observerLock().tryLock())
return;
+ Locker locker { AdoptLockTag { }, observerLock() };
for (Observer& observer : observers())
observer.didLogMessage(channel, level, { ConsoleLogValue<Argument>::toValue(arguments)... });
}
- WTF_EXPORT_PRIVATE static Vector<std::reference_wrapper<Observer>>& observers();
+ WTF_EXPORT_PRIVATE static Vector<std::reference_wrapper<Observer>>& observers() WTF_REQUIRES_LOCK(observerLock());
- static Lock& observerLock()
+ static CheckedLock& observerLock() WTF_RETURNS_LOCK(loggerObserverLock)
{
return loggerObserverLock;
}
Modified: trunk/Source/WebCore/ChangeLog (277874 => 277875)
--- trunk/Source/WebCore/ChangeLog 2021-05-21 19:04:39 UTC (rev 277874)
+++ trunk/Source/WebCore/ChangeLog 2021-05-21 19:24:05 UTC (rev 277875)
@@ -1,3 +1,36 @@
+2021-05-21 Chris Dumez <cdu...@apple.com>
+
+ Use CheckedLock more in cases where we try-lock
+ https://bugs.webkit.org/show_bug.cgi?id=226056
+
+ Reviewed by Alex Christensen.
+
+ Use CheckedLock more in cases where we try-lock to benefit from Clang
+ Thread Safety Analysis.
+
+ * Modules/webaudio/AudioParamTimeline.cpp:
+ (WebCore::AudioParamTimeline::setValueAtTime):
+ (WebCore::AudioParamTimeline::linearRampToValueAtTime):
+ (WebCore::AudioParamTimeline::exponentialRampToValueAtTime):
+ (WebCore::AudioParamTimeline::setTargetAtTime):
+ (WebCore::AudioParamTimeline::setValueCurveAtTime):
+ (WebCore::AudioParamTimeline::cancelScheduledValues):
+ (WebCore::AudioParamTimeline::cancelAndHoldAtTime):
+ (WebCore::AudioParamTimeline::valueForContextTime):
+ (WebCore::AudioParamTimeline::valuesForFrameRange):
+ (WebCore::AudioParamTimeline::hasValues const):
+ * Modules/webaudio/AudioParamTimeline.h:
+ * platform/audio/AudioDestination.h:
+ (WebCore::AudioDestination::WTF_GUARDED_BY_LOCK):
+ (WebCore::AudioDestination::AudioDestination):
+ (WebCore::AudioDestination::clearCallback):
+ (WebCore::AudioDestination::callRenderCallback):
+ * platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.cpp:
+ (WebCore::AudioMediaStreamTrackRendererUnit::addSource):
+ (WebCore::AudioMediaStreamTrackRendererUnit::removeSource):
+ (WebCore::AudioMediaStreamTrackRendererUnit::render):
+ * platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h:
+
2021-05-21 Per Arne <pvol...@apple.com>
Accessibility caption styles does not always reflect the selection
Modified: trunk/Source/WebCore/Modules/webaudio/AudioParamTimeline.cpp (277874 => 277875)
--- trunk/Source/WebCore/Modules/webaudio/AudioParamTimeline.cpp 2021-05-21 19:04:39 UTC (rev 277874)
+++ trunk/Source/WebCore/Modules/webaudio/AudioParamTimeline.cpp 2021-05-21 19:24:05 UTC (rev 277875)
@@ -73,13 +73,13 @@
ExceptionOr<void> AudioParamTimeline::setValueAtTime(float value, Seconds time)
{
- auto locker = holdLock(m_eventsLock);
+ Locker locker { m_eventsLock };
return insertEvent(ParamEvent::createSetValueEvent(value, time));
}
ExceptionOr<void> AudioParamTimeline::linearRampToValueAtTime(float targetValue, Seconds endTime, float currentValue, Seconds currentTime)
{
- auto locker = holdLock(m_eventsLock);
+ Locker locker { m_eventsLock };
// Linear ramp events need a preceding event so that they have an initial value.
if (m_events.isEmpty())
@@ -90,7 +90,7 @@
ExceptionOr<void> AudioParamTimeline::exponentialRampToValueAtTime(float targetValue, Seconds endTime, float currentValue, Seconds currentTime)
{
- auto locker = holdLock(m_eventsLock);
+ Locker locker { m_eventsLock };
// Exponential ramp events need a preceding event so that they have an initial value.
if (m_events.isEmpty())
@@ -101,7 +101,7 @@
ExceptionOr<void> AudioParamTimeline::setTargetAtTime(float target, Seconds time, float timeConstant)
{
- auto locker = holdLock(m_eventsLock);
+ Locker locker { m_eventsLock };
// If timeConstant is 0, we instantly jump to the target value, so insert a SetValueEvent instead of SetTargetEvent.
if (!timeConstant)
return insertEvent(ParamEvent::createSetValueEvent(target, time));
@@ -110,7 +110,7 @@
ExceptionOr<void> AudioParamTimeline::setValueCurveAtTime(Vector<float>&& curve, Seconds time, Seconds duration)
{
- auto locker = holdLock(m_eventsLock);
+ Locker locker { m_eventsLock };
float curveEndValue = curve.last();
auto result = insertEvent(ParamEvent::createSetValueCurveEvent(WTFMove(curve), time, duration));
@@ -186,7 +186,7 @@
void AudioParamTimeline::cancelScheduledValues(Seconds cancelTime)
{
- auto locker = holdLock(m_eventsLock);
+ Locker locker { m_eventsLock };
// Remove all events whose start time is greater than or equal to the cancel time.
// Also handle the special case where the cancel time lies in the middle of a
@@ -215,7 +215,7 @@
ExceptionOr<void> AudioParamTimeline::cancelAndHoldAtTime(Seconds cancelTime)
{
- auto locker = holdLock(m_eventsLock);
+ Locker locker { m_eventsLock };
// Find the first event at or just past cancelTime.
size_t i = m_events.findMatching([&](auto& event) {
@@ -327,9 +327,11 @@
Optional<float> AudioParamTimeline::valueForContextTime(BaseAudioContext& context, float defaultValue, float minValue, float maxValue)
{
{
- auto locker = tryHoldLock(m_eventsLock);
- if (!locker || !m_events.size() || Seconds { context.currentTime() } < m_events[0].time())
+ if (!m_eventsLock.tryLock())
return WTF::nullopt;
+ Locker locker { AdoptLockTag { }, m_eventsLock };
+ if (!m_events.size() || Seconds { context.currentTime() } < m_events[0].time())
+ return WTF::nullopt;
}
// Ask for just a single value.
@@ -345,11 +347,11 @@
float AudioParamTimeline::valuesForFrameRange(size_t startFrame, size_t endFrame, float defaultValue, float minValue, float maxValue, float* values, unsigned numberOfValues, double sampleRate, double controlRate)
{
// We can't contend the lock in the realtime audio thread.
- auto locker = tryHoldLock(m_eventsLock);
- if (!locker) {
+ if (!m_eventsLock.tryLock()) {
std::fill_n(values, numberOfValues, defaultValue);
return defaultValue;
}
+ Locker locker { AdoptLockTag { }, m_eventsLock };
float value = valuesForFrameRangeImpl(startFrame, endFrame, defaultValue, values, numberOfValues, sampleRate, controlRate);
@@ -984,9 +986,9 @@
bool AudioParamTimeline::hasValues(size_t startFrame, double sampleRate) const
{
- auto locker = tryHoldLock(m_eventsLock);
- if (!locker)
+ if (!m_eventsLock.tryLock())
return true;
+ Locker locker { AdoptLockTag { }, m_eventsLock };
// Return false if there are no events in the time range.
auto endFrame = startFrame + AudioUtilities::renderQuantumSize;
Modified: trunk/Source/WebCore/Modules/webaudio/AudioParamTimeline.h (277874 => 277875)
--- trunk/Source/WebCore/Modules/webaudio/AudioParamTimeline.h 2021-05-21 19:04:39 UTC (rev 277874)
+++ trunk/Source/WebCore/Modules/webaudio/AudioParamTimeline.h 2021-05-21 19:24:05 UTC (rev 277875)
@@ -30,7 +30,7 @@
#include "AudioContext.h"
#include <_javascript_Core/Float32Array.h>
-#include <wtf/Lock.h>
+#include <wtf/CheckedLock.h>
#include <wtf/Vector.h>
namespace WebCore {
@@ -189,9 +189,9 @@
const int eventIndex;
};
- void removeCancelledEvents(size_t firstEventToRemove);
- ExceptionOr<void> insertEvent(ParamEvent&&);
- float valuesForFrameRangeImpl(size_t startFrame, size_t endFrame, float defaultValue, float* values, unsigned numberOfValues, double sampleRate, double controlRate);
+ void removeCancelledEvents(size_t firstEventToRemove) WTF_REQUIRES_LOCK(m_eventsLock);
+ ExceptionOr<void> insertEvent(ParamEvent&&) WTF_REQUIRES_LOCK(m_eventsLock);
+ float valuesForFrameRangeImpl(size_t startFrame, size_t endFrame, float defaultValue, float* values, unsigned numberOfValues, double sampleRate, double controlRate) WTF_REQUIRES_LOCK(m_eventsLock);
float linearRampAtTime(Seconds t, float value1, Seconds time1, float value2, Seconds time2);
float exponentialRampAtTime(Seconds t, float value1, Seconds time1, float value2, Seconds time2);
float valueCurveAtTime(Seconds t, Seconds time1, Seconds duration, const float* curveData, size_t curveLength);
@@ -200,14 +200,14 @@
void processLinearRamp(const AutomationState&, float* values, size_t& currentFrame, float& value, unsigned& writeIndex);
void processExponentialRamp(const AutomationState&, float* values, size_t& currentFrame, float& value, unsigned& writeIndex);
- void processCancelValues(const AutomationState&, float* values, size_t& currentFrame, float& value, unsigned& writeIndex);
+ void processCancelValues(const AutomationState&, float* values, size_t& currentFrame, float& value, unsigned& writeIndex) WTF_REQUIRES_LOCK(m_eventsLock);
void processSetTarget(const AutomationState&, float* values, size_t& currentFrame, float& value, unsigned& writeIndex);
void processSetValueCurve(const AutomationState&, float* values, size_t& currentFrame, float& value, unsigned& writeIndex);
- void processSetTargetFollowedByRamp(int eventIndex, ParamEvent*&, ParamEvent::Type nextEventType, size_t currentFrame, double samplingPeriod, double controlRate, float& value);
+ void processSetTargetFollowedByRamp(int eventIndex, ParamEvent*&, ParamEvent::Type nextEventType, size_t currentFrame, double samplingPeriod, double controlRate, float& value) WTF_REQUIRES_LOCK(m_eventsLock);
- Vector<ParamEvent> m_events;
+ Vector<ParamEvent> m_events WTF_GUARDED_BY_LOCK(m_eventsLock);
- mutable Lock m_eventsLock;
+ mutable CheckedLock m_eventsLock;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/audio/AudioDestination.h (277874 => 277875)
--- trunk/Source/WebCore/platform/audio/AudioDestination.h 2021-05-21 19:04:39 UTC (rev 277874)
+++ trunk/Source/WebCore/platform/audio/AudioDestination.h 2021-05-21 19:24:05 UTC (rev 277875)
@@ -32,6 +32,7 @@
#include "AudioBus.h"
#include "AudioIOCallback.h"
#include <memory>
+#include <wtf/CheckedLock.h>
#include <wtf/CompletionHandler.h>
#include <wtf/Lock.h>
#include <wtf/ThreadSafeRefCounted.h>
@@ -77,30 +78,32 @@
protected:
explicit AudioDestination(AudioIOCallback&);
- Lock m_callbackLock;
- AudioIOCallback* m_callback { nullptr };
+ CheckedLock m_callbackLock;
+ AudioIOCallback* m_callback WTF_GUARDED_BY_LOCK(m_callbackLock) { nullptr };
};
inline AudioDestination::AudioDestination(AudioIOCallback& callback)
{
- auto locker = holdLock(m_callbackLock);
+ Locker locker { m_callbackLock };
m_callback = &callback;
}
inline void AudioDestination::clearCallback()
{
- auto locker = holdLock(m_callbackLock);
+ Locker locker { m_callbackLock };
m_callback = nullptr;
}
inline void AudioDestination::callRenderCallback(AudioBus* sourceBus, AudioBus* destinationBus, size_t framesToProcess, const AudioIOPosition& outputPosition)
{
- auto locker = tryHoldLock(m_callbackLock);
- if (!locker || !m_callback) {
- destinationBus->zero();
- return;
+ if (m_callbackLock.tryLock()) {
+ Locker locker { AdoptLockTag { }, m_callbackLock };
+ if (m_callback) {
+ m_callback->render(sourceBus, destinationBus, framesToProcess, outputPosition);
+ return;
+ }
}
- m_callback->render(sourceBus, destinationBus, framesToProcess, outputPosition);
+ destinationBus->zero();
}
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/audio/cocoa/AudioDestinationCocoa.cpp (277874 => 277875)
--- trunk/Source/WebCore/platform/audio/cocoa/AudioDestinationCocoa.cpp 2021-05-21 19:04:39 UTC (rev 277874)
+++ trunk/Source/WebCore/platform/audio/cocoa/AudioDestinationCocoa.cpp 2021-05-21 19:24:05 UTC (rev 277875)
@@ -160,7 +160,7 @@
}
{
- auto locker = holdLock(m_callbackLock);
+ Locker locker { m_callbackLock };
if (m_callback)
m_callback->isPlayingDidChange();
}
Modified: trunk/Source/WebKit/ChangeLog (277874 => 277875)
--- trunk/Source/WebKit/ChangeLog 2021-05-21 19:04:39 UTC (rev 277874)
+++ trunk/Source/WebKit/ChangeLog 2021-05-21 19:24:05 UTC (rev 277875)
@@ -1,3 +1,24 @@
+2021-05-21 Chris Dumez <cdu...@apple.com>
+
+ Use CheckedLock more in cases where we try-lock
+ https://bugs.webkit.org/show_bug.cgi?id=226056
+
+ Reviewed by Alex Christensen.
+
+ Use CheckedLock more in cases where we try-lock to benefit from Clang
+ Thread Safety Analysis.
+
+ * WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp:
+ (WebKit::LibWebRTCCodecs::releaseDecoder):
+ (WebKit::LibWebRTCCodecs::registerDecodeFrameCallback):
+ (WebKit::LibWebRTCCodecs::completedDecoding):
+ (WebKit::LibWebRTCCodecs::releaseEncoder):
+ (WebKit::LibWebRTCCodecs::registerEncodeFrameCallback):
+ (WebKit::LibWebRTCCodecs::completedEncoding):
+ * WebProcess/GPU/webrtc/LibWebRTCCodecs.h:
+ (WebKit::LibWebRTCCodecs::Decoder::WTF_GUARDED_BY_LOCK):
+ (WebKit::LibWebRTCCodecs::Encoder::WTF_GUARDED_BY_LOCK):
+
2021-05-21 Per Arne <pvol...@apple.com>
Accessibility caption styles does not always reflect the selection
Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp (277874 => 277875)
--- trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp 2021-05-21 19:04:39 UTC (rev 277874)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp 2021-05-21 19:24:05 UTC (rev 277875)
@@ -270,7 +270,12 @@
int32_t LibWebRTCCodecs::releaseDecoder(Decoder& decoder)
{
- ASSERT(!decoder.decodedImageCallback);
+#if ASSERT_ENABLED
+ {
+ Locker locker { decoder.decodedImageCallbackLock };
+ ASSERT(!decoder.decodedImageCallback);
+ }
+#endif
ensureGPUProcessConnectionAndDispatchToThread([this, decoderIdentifier = decoder.identifier] {
ASSERT(m_decoders.contains(decoderIdentifier));
if (auto decoder = m_decoders.take(decoderIdentifier)) {
@@ -298,7 +303,7 @@
void LibWebRTCCodecs::registerDecodeFrameCallback(Decoder& decoder, void* decodedImageCallback)
{
- LockHolder holder(decoder.decodedImageCallbackLock);
+ Locker locker { decoder.decodedImageCallbackLock };
decoder.decodedImageCallback = decodedImageCallback;
}
@@ -319,10 +324,11 @@
if (!decoder)
return;
- auto locker = tryHoldLock(decoder->decodedImageCallbackLock);
- if (!locker)
+ if (!decoder->decodedImageCallbackLock.tryLock())
return;
+ Locker locker { AdoptLockTag { }, decoder->decodedImageCallbackLock };
+
if (!decoder->decodedImageCallback)
return;
@@ -393,7 +399,12 @@
int32_t LibWebRTCCodecs::releaseEncoder(Encoder& encoder)
{
- ASSERT(!encoder.encodedImageCallback);
+#if ASSERT_ENABLED
+ {
+ Locker locker { encoder.encodedImageCallbackLock };
+ ASSERT(!encoder.encodedImageCallback);
+ }
+#endif
ensureGPUProcessConnectionAndDispatchToThread([this, encoderIdentifier = encoder.identifier] {
ASSERT(m_encoders.contains(encoderIdentifier));
auto encoder = m_encoders.take(encoderIdentifier);
@@ -454,7 +465,7 @@
void LibWebRTCCodecs::registerEncodeFrameCallback(Encoder& encoder, void* encodedImageCallback)
{
- LockHolder holder(encoder.encodedImageCallbackLock);
+ Locker locker { encoder.encodedImageCallbackLock };
encoder.encodedImageCallback = encodedImageCallback;
}
@@ -481,10 +492,11 @@
if (!encoder)
return;
- auto locker = tryHoldLock(encoder->encodedImageCallbackLock);
- if (!locker)
+ if (!encoder->encodedImageCallbackLock.tryLock())
return;
+ Locker locker { AdoptLockTag { }, encoder->encodedImageCallbackLock };
+
if (!encoder->encodedImageCallback)
return;
Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.h (277874 => 277875)
--- trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.h 2021-05-21 19:04:39 UTC (rev 277874)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.h 2021-05-21 19:24:05 UTC (rev 277875)
@@ -74,8 +74,8 @@
public:
RTCDecoderIdentifier identifier;
Type type;
- void* decodedImageCallback { nullptr };
- Lock decodedImageCallbackLock;
+ void* decodedImageCallback WTF_GUARDED_BY_LOCK(decodedImageCallbackLock) { nullptr };
+ CheckedLock decodedImageCallbackLock;
bool hasError { false };
RefPtr<IPC::Connection> connection;
};
@@ -100,8 +100,8 @@
webrtc::VideoCodecType codecType { webrtc::kVideoCodecGeneric };
Vector<std::pair<String, String>> parameters;
Optional<EncoderInitializationData> initializationData;
- void* encodedImageCallback { nullptr };
- Lock encodedImageCallbackLock;
+ void* encodedImageCallback WTF_GUARDED_BY_LOCK(encodedImageCallbackLock) { nullptr };
+ CheckedLock encodedImageCallbackLock;
RefPtr<IPC::Connection> connection;
};