Diff
Modified: trunk/Source/WTF/ChangeLog (260240 => 260241)
--- trunk/Source/WTF/ChangeLog 2020-04-17 08:37:37 UTC (rev 260240)
+++ trunk/Source/WTF/ChangeLog 2020-04-17 08:40:52 UTC (rev 260241)
@@ -1,3 +1,12 @@
+2020-04-17 Youenn Fablet <[email protected]>
+
+ Make use of WeakHashSet for MediaStreamTrackPrivate and RealtimeMediaSource observers
+ https://bugs.webkit.org/show_bug.cgi?id=210492
+
+ Reviewed by Geoffrey Garen.
+
+ * wtf/WeakHashSet.h:
+
2020-04-16 Daniel Bates <[email protected]>
Clean up VectorCocoa createNSArray overloads and add documentation for createNSArray taking a map function
Modified: trunk/Source/WTF/wtf/WeakHashSet.h (260240 => 260241)
--- trunk/Source/WTF/wtf/WeakHashSet.h 2020-04-17 08:37:37 UTC (rev 260240)
+++ trunk/Source/WTF/wtf/WeakHashSet.h 2020-04-17 08:40:52 UTC (rev 260241)
@@ -138,6 +138,14 @@
return m_set.size();
}
+ void forEach(const Function<void(T&)>& callback)
+ {
+ for (auto& item : map(m_set, [](auto& item) { return makeWeakPtr(item->template get<T>()); })) {
+ if (item && m_set.contains(*item.m_impl))
+ callback(*item);
+ }
+ }
+
#if ASSERT_ENABLED
void checkConsistency() const { m_set.checkConsistency(); }
#else
Modified: trunk/Source/WebCore/ChangeLog (260240 => 260241)
--- trunk/Source/WebCore/ChangeLog 2020-04-17 08:37:37 UTC (rev 260240)
+++ trunk/Source/WebCore/ChangeLog 2020-04-17 08:40:52 UTC (rev 260241)
@@ -1,3 +1,38 @@
+2020-04-17 Youenn Fablet <[email protected]>
+
+ Make use of WeakHashSet for MediaStreamTrackPrivate and RealtimeMediaSource observers
+ https://bugs.webkit.org/show_bug.cgi?id=210492
+
+ Reviewed by Geoffrey Garen.
+
+ We are making use of WeakHashSet to improve the robustness of the code.
+ For that purpose we use the new WeakHashSet::forEach method.
+ No change of behavior.
+
+ * Modules/mediarecorder/MediaRecorder.h:
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h:
+ * platform/mediastream/MediaStreamPrivate.cpp:
+ (WebCore::MediaStreamPrivate::forEachObserver const):
+ * platform/mediastream/MediaStreamTrackPrivate.cpp:
+ (WebCore::MediaStreamTrackPrivate::forEachObserver):
+ (WebCore::MediaStreamTrackPrivate::addObserver):
+ (WebCore::MediaStreamTrackPrivate::removeObserver):
+ (WebCore::MediaStreamTrackPrivate::forEachObserver const): Deleted.
+ * platform/mediastream/MediaStreamTrackPrivate.h:
+ (WebCore::MediaStreamTrackPrivate::hasObserver const): Deleted.
+ * platform/mediastream/RealtimeMediaSource.cpp:
+ (WebCore::RealtimeMediaSource::addAudioSampleObserver):
+ (WebCore::RealtimeMediaSource::removeAudioSampleObserver):
+ (WebCore::RealtimeMediaSource::addObserver):
+ (WebCore::RealtimeMediaSource::removeObserver):
+ (WebCore::RealtimeMediaSource::forEachObserver):
+ (WebCore::RealtimeMediaSource::notifyMutedObservers):
+ (WebCore::RealtimeMediaSource::requestToEnd):
+ (WebCore::RealtimeMediaSource::forEachObserver const): Deleted.
+ (WebCore::RealtimeMediaSource::notifyMutedObservers const): Deleted.
+ * platform/mediastream/RealtimeMediaSource.h:
+ * platform/mediastream/RealtimeOutgoingVideoSource.h:
+
2020-04-17 Rob Buis <[email protected]>
Move allowPlugins to FrameLoader
Modified: trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h (260240 => 260241)
--- trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h 2020-04-17 08:37:37 UTC (rev 260240)
+++ trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h 2020-04-17 08:40:52 UTC (rev 260241)
@@ -42,7 +42,6 @@
: public ActiveDOMObject
, public RefCounted<MediaRecorder>
, public EventTargetWithInlineData
- , public CanMakeWeakPtr<MediaRecorder>
, private MediaStream::Observer
, private MediaStreamTrackPrivate::Observer {
WTF_MAKE_ISO_ALLOCATED(MediaRecorder);
Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h (260240 => 260241)
--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h 2020-04-17 08:37:37 UTC (rev 260240)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h 2020-04-17 08:40:52 UTC (rev 260241)
@@ -51,7 +51,7 @@
class VideoLayerManagerObjC;
class VideoTrackPrivateMediaStream;
-class MediaPlayerPrivateMediaStreamAVFObjC final : public MediaPlayerPrivateInterface, private MediaStreamPrivate::Observer, private MediaStreamTrackPrivate::Observer, public SampleBufferDisplayLayer::Client
+class MediaPlayerPrivateMediaStreamAVFObjC final : public MediaPlayerPrivateInterface, private MediaStreamPrivate::Observer, public MediaStreamTrackPrivate::Observer, public SampleBufferDisplayLayer::Client
, private LoggerHelper
{
public:
@@ -78,6 +78,9 @@
const void* logIdentifier() const final { return reinterpret_cast<const void*>(m_logIdentifier); }
WTFLogChannel& logChannel() const final;
+ using MediaStreamTrackPrivate::Observer::weakPtrFactory;
+ using WeakValueType = MediaStreamTrackPrivate::Observer::WeakValueType;
+
private:
PlatformLayer* rootLayer() const;
void rootLayerBoundsDidChange();
Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp (260240 => 260241)
--- trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp 2020-04-17 08:37:37 UTC (rev 260240)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp 2020-04-17 08:40:52 UTC (rev 260241)
@@ -78,27 +78,23 @@
m_source->removeObserver(*this);
}
-void MediaStreamTrackPrivate::forEachObserver(const Function<void(Observer&)>& apply) const
+void MediaStreamTrackPrivate::forEachObserver(const Function<void(Observer&)>& apply)
{
ASSERT(isMainThread());
auto protectedThis = makeRef(*this);
- for (auto* observer : copyToVector(m_observers)) {
- if (!m_observers.contains(observer))
- continue;
- apply(*observer);
- }
+ m_observers.forEach(apply);
}
void MediaStreamTrackPrivate::addObserver(MediaStreamTrackPrivate::Observer& observer)
{
ASSERT(isMainThread());
- m_observers.add(&observer);
+ m_observers.add(observer);
}
void MediaStreamTrackPrivate::removeObserver(MediaStreamTrackPrivate::Observer& observer)
{
ASSERT(isMainThread());
- m_observers.remove(&observer);
+ m_observers.remove(observer);
}
const String& MediaStreamTrackPrivate::label() const
Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h (260240 => 260241)
--- trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h 2020-04-17 08:37:37 UTC (rev 260240)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h 2020-04-17 08:40:52 UTC (rev 260241)
@@ -32,7 +32,7 @@
#include "RealtimeMediaSource.h"
#include <wtf/LoggerHelper.h>
#include <wtf/RefCounted.h>
-#include <wtf/WeakPtr.h>
+#include <wtf/WeakHashSet.h>
namespace WebCore {
@@ -44,7 +44,6 @@
class MediaStreamTrackPrivate final
: public RefCounted<MediaStreamTrackPrivate>
- , public CanMakeWeakPtr<MediaStreamTrackPrivate, WeakPtrFactoryInitialization::Eager>
, public RealtimeMediaSource::Observer
#if !RELEASE_LOG_DISABLED
, public LoggerHelper
@@ -51,7 +50,7 @@
#endif
{
public:
- class Observer {
+ class Observer : public CanMakeWeakPtr<Observer> {
public:
virtual ~Observer() = default;
@@ -104,9 +103,7 @@
void addObserver(Observer&);
void removeObserver(Observer&);
-#if ASSERT_ENABLED
- bool hasObserver(Observer&) const;
-#endif
+ bool hasObserver(Observer& observer) const { return m_observers.contains(observer); }
WEBCORE_EXPORT const RealtimeMediaSourceSettings& settings() const;
const RealtimeMediaSourceCapabilities& capabilities() const;
@@ -142,7 +139,7 @@
void updateReadyState();
- void forEachObserver(const WTF::Function<void(Observer&)>&) const;
+ void forEachObserver(const Function<void(Observer&)>&);
#if !RELEASE_LOG_DISABLED
const char* logClassName() const final { return "MediaStreamTrackPrivate"; }
@@ -149,8 +146,7 @@
WTFLogChannel& logChannel() const final;
#endif
- mutable RecursiveLock m_observersLock;
- HashSet<Observer*> m_observers;
+ WeakHashSet<Observer> m_observers;
Ref<RealtimeMediaSource> m_source;
String m_id;
@@ -169,14 +165,6 @@
typedef Vector<RefPtr<MediaStreamTrackPrivate>> MediaStreamTrackPrivateVector;
-#if ASSERT_ENABLED
-inline bool MediaStreamTrackPrivate::hasObserver(Observer& observer) const
-{
- auto locker = holdLock(m_observersLock);
- return m_observers.contains(&observer);
-}
-#endif
-
} // namespace WebCore
#endif // ENABLE(MEDIA_STREAM)
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (260240 => 260241)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp 2020-04-17 08:37:37 UTC (rev 260240)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp 2020-04-17 08:40:52 UTC (rev 260241)
@@ -60,7 +60,7 @@
m_hashedID = RealtimeMediaSourceCenter::singleton().hashStringWithSalt(m_persistentID, m_idHashSalt);
}
-void RealtimeMediaSource::addAudioSampleObserver(RealtimeMediaSource::AudioSampleObserver& observer)
+void RealtimeMediaSource::addAudioSampleObserver(AudioSampleObserver& observer)
{
ASSERT(isMainThread());
auto locker = holdLock(m_audioSampleObserversLock);
@@ -67,7 +67,7 @@
m_audioSampleObservers.add(&observer);
}
-void RealtimeMediaSource::removeAudioSampleObserver(RealtimeMediaSource::AudioSampleObserver& observer)
+void RealtimeMediaSource::removeAudioSampleObserver(AudioSampleObserver& observer)
{
ASSERT(isMainThread());
auto locker = holdLock(m_audioSampleObserversLock);
@@ -74,17 +74,17 @@
m_audioSampleObservers.remove(&observer);
}
-void RealtimeMediaSource::addObserver(RealtimeMediaSource::Observer& observer)
+void RealtimeMediaSource::addObserver(Observer& observer)
{
ASSERT(isMainThread());
- m_observers.add(&observer);
+ m_observers.add(observer);
}
-void RealtimeMediaSource::removeObserver(RealtimeMediaSource::Observer& observer)
+void RealtimeMediaSource::removeObserver(Observer& observer)
{
ASSERT(isMainThread());
- m_observers.remove(&observer);
- if (m_observers.isEmpty())
+ m_observers.remove(observer);
+ if (m_observers.computesEmpty())
stopBeingObserved();
}
@@ -130,18 +130,14 @@
notifyMutedChange(interrupted);
}
-void RealtimeMediaSource::forEachObserver(const Function<void(Observer&)>& apply) const
+void RealtimeMediaSource::forEachObserver(const Function<void(Observer&)>& apply)
{
ASSERT(isMainThread());
auto protectedThis = makeRef(*this);
- for (auto* observer : copyToVector(m_observers)) {
- if (!m_observers.contains(observer))
- continue;
- apply(*observer);
- }
+ m_observers.forEach(apply);
}
-void RealtimeMediaSource::notifyMutedObservers() const
+void RealtimeMediaSource::notifyMutedObservers()
{
forEachObserver([](auto& observer) {
observer.sourceMutedChanged();
@@ -257,7 +253,7 @@
m_isEnded = true;
hasEnded();
- forEachObserver([callingObserver](auto& observer) {
+ forEachObserver([&callingObserver](auto& observer) {
if (&observer != &callingObserver)
observer.sourceStopped();
});
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h (260240 => 260241)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h 2020-04-17 08:37:37 UTC (rev 260240)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h 2020-04-17 08:40:52 UTC (rev 260241)
@@ -47,7 +47,7 @@
#include <wtf/RecursiveLockAdapter.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/Vector.h>
-#include <wtf/WeakPtr.h>
+#include <wtf/WeakHashSet.h>
#include <wtf/text/WTFString.h>
namespace WTF {
@@ -75,7 +75,7 @@
#endif
{
public:
- class Observer {
+ class Observer : public CanMakeWeakPtr<Observer> {
public:
virtual ~Observer();
@@ -228,7 +228,7 @@
virtual bool supportsSizeAndFrameRate(Optional<int> width, Optional<int> height, Optional<double>);
virtual void setSizeAndFrameRate(Optional<int> width, Optional<int> height, Optional<double>);
- void notifyMutedObservers() const;
+ void notifyMutedObservers();
void notifyMutedChange(bool muted);
void notifySettingsDidChangeObservers(OptionSet<RealtimeMediaSourceSettings::Flag>);
@@ -239,7 +239,7 @@
void videoSampleAvailable(MediaSample&);
void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t);
- void forEachObserver(const WTF::Function<void(Observer&)>&) const;
+ void forEachObserver(const Function<void(Observer&)>&);
private:
virtual void startProducingData() { }
@@ -262,7 +262,7 @@
String m_persistentID;
Type m_type;
String m_name;
- HashSet<Observer*> m_observers;
+ WeakHashSet<Observer> m_observers;
mutable RecursiveLock m_audioSampleObserversLock;
HashSet<AudioSampleObserver*> m_audioSampleObservers;
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingVideoSource.h (260240 => 260241)
--- trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingVideoSource.h 2020-04-17 08:37:37 UTC (rev 260240)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingVideoSource.h 2020-04-17 08:40:52 UTC (rev 260241)
@@ -101,6 +101,9 @@
void observeSource();
void unobserveSource();
+ using MediaStreamTrackPrivate::Observer::weakPtrFactory;
+ using WeakValueType = MediaStreamTrackPrivate::Observer::WeakValueType;
+
// Notifier API
void RegisterObserver(webrtc::ObserverInterface*) final { }
void UnregisterObserver(webrtc::ObserverInterface*) final { }