Title: [260241] trunk/Source
Revision
260241
Author
[email protected]
Date
2020-04-17 01:40:52 -0700 (Fri, 17 Apr 2020)

Log Message

Make use of WeakHashSet for MediaStreamTrackPrivate and RealtimeMediaSource observers
https://bugs.webkit.org/show_bug.cgi?id=210492

Reviewed by Geoffrey Garen.

Source/WebCore:

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:

Source/WTF:

* wtf/WeakHashSet.h:

Modified Paths

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 { }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to