WebKit Bugzilla
Attachment 361412 Details for
Bug 194312
: Make sure to clear sources from UserMediaCaptureManagerProxy and UserMediaCaptureManager when no longer needed
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch for landing
bug-194312-20190207103743.patch (text/plain), 12.17 KB, created by
youenn fablet
on 2019-02-07 10:37:44 PST
(
hide
)
Description:
Patch for landing
Filename:
MIME Type:
Creator:
youenn fablet
Created:
2019-02-07 10:37:44 PST
Size:
12.17 KB
patch
obsolete
>Subversion Revision: 241123 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index c2a1672b1bf022b6bbcffcdc5ef172431e7de24c..90ab4a4951a51f7cee97cfbc0a3b35e4e3039195 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,17 @@ >+2019-02-07 Youenn Fablet <youenn@apple.com> >+ >+ Make to clear sources from UserMediaCaptureManagerProxy and UserMediaCaptureManager when no longer needed >+ https://bugs.webkit.org/show_bug.cgi?id=194312 >+ >+ Reviewed by Eric Carlson. >+ >+ Add a way for sources to know when they are ended, i.e. that they will never be started again. >+ No observable change of behavior. >+ >+ * platform/mediastream/RealtimeMediaSource.cpp: >+ (WebCore::RealtimeMediaSource::requestStop): >+ * platform/mediastream/RealtimeMediaSource.h: >+ > 2019-02-07 Zalan Bujtas <zalan@apple.com> > > [LFC][Out-of-flow] Use the containing block's padding width when computing min/max width. >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index e2486afb93e7cfeee767490eeafaa921d8278a9b..ee72a97a247f82ac50435e13dae092165efa0793 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,27 @@ >+2019-02-07 Youenn Fablet <youenn@apple.com> >+ >+ Make to clear sources from UserMediaCaptureManagerProxy and UserMediaCaptureManager when no longer needed >+ https://bugs.webkit.org/show_bug.cgi?id=194312 >+ >+ Reviewed by Eric Carlson. >+ >+ Sources in UserMediaCaptureManager and Proxy are never removed once added to their HashMap. >+ Use the 'ended' mechanism to do the clean-up on WebProcess side. >+ As part of this clean-up, send IPC to UIProcess to do clean-up on proxy side. >+ On WebProcess crash case, clean-up the proxy as well. >+ >+ * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp: >+ (WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints): >+ (WebKit::UserMediaCaptureManagerProxy::end): >+ (WebKit::UserMediaCaptureManagerProxy::clear): >+ * UIProcess/Cocoa/UserMediaCaptureManagerProxy.h: >+ * UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in: >+ * UIProcess/WebProcessProxy.cpp: >+ (WebKit::WebProcessProxy::processDidTerminateOrFailedToLaunch): >+ * WebProcess/cocoa/UserMediaCaptureManager.cpp: >+ (WebKit::UserMediaCaptureManager::sourceEnded): >+ * WebProcess/cocoa/UserMediaCaptureManager.h: >+ > 2019-02-07 Miguel Gomez <magomez@igalia.com> > > [WPE] Implement GStreamer based holepunch >diff --git a/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp b/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp >index 95fa95ed4f94b84cd09d6f18bbfdf61d53f588f9..09d0db9b4c119c14fca34d3fa3aa52cc1474d47b 100644 >--- a/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp >+++ b/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp >@@ -137,7 +137,7 @@ void MediaStreamTrackPrivate::endTrack() > m_isEnded = true; > updateReadyState(); > >- m_source->requestStop(this); >+ m_source->requestToEnd(*this); > > forEachObserver([this](auto& observer) { > observer.trackEnded(*this); >diff --git a/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp b/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp >index 96cf5d99c3bb25e29c2f6bb396c8b5b802679196..7f39db216da8abeec76344379e51b1a7e941852d 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp >+++ b/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp >@@ -172,7 +172,7 @@ void RealtimeMediaSource::audioSamplesAvailable(const MediaTime& time, const Pla > > void RealtimeMediaSource::start() > { >- if (m_isProducingData) >+ if (m_isProducingData || m_isEnded) > return; > > m_isProducingData = true; >@@ -195,7 +195,7 @@ void RealtimeMediaSource::stop() > stopProducingData(); > } > >-void RealtimeMediaSource::requestStop(Observer* callingObserver) >+void RealtimeMediaSource::requestToEnd(Observer& callingObserver) > { > if (!m_isProducingData) > return; >@@ -208,10 +208,14 @@ void RealtimeMediaSource::requestStop(Observer* callingObserver) > if (hasObserverPreventingStopping) > return; > >+ auto protectedThis = makeRef(*this); >+ > stop(); >+ m_isEnded = true; >+ hasEnded(); > > forEachObserver([callingObserver](auto& observer) { >- if (&observer != callingObserver) >+ if (&observer != &callingObserver) > observer.sourceStopped(); > }); > } >diff --git a/Source/WebCore/platform/mediastream/RealtimeMediaSource.h b/Source/WebCore/platform/mediastream/RealtimeMediaSource.h >index 8e462c7e8869ed268a90496eb7f5bde078e9b5f4..79a79e105886df5c990894105f2e10887ceb2d00 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeMediaSource.h >+++ b/Source/WebCore/platform/mediastream/RealtimeMediaSource.h >@@ -100,7 +100,7 @@ public: > bool isProducingData() const { return m_isProducingData; } > void start(); > void stop(); >- void requestStop(Observer* callingObserver = nullptr); >+ void requestToEnd(Observer& callingObserver); > > bool muted() const { return m_muted; } > void setMuted(bool); >@@ -211,6 +211,8 @@ private: > virtual void stopProducingData() { } > virtual void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) { } > >+ virtual void hasEnded() { } >+ > void forEachObserver(const WTF::Function<void(Observer&)>&) const; > > bool m_muted { false }; >@@ -238,6 +240,7 @@ private: > bool m_interrupted { false }; > bool m_captureDidFailed { false }; > bool m_isRemote { false }; >+ bool m_isEnded { false }; > }; > > struct CaptureSourceOrError { >diff --git a/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp b/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp >index 056d5c342dd05b529c6f26a129b7207fe41343f7..c4540e70b13770bbd7a3533e0e644f2ff7449b56 100644 >--- a/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp >+++ b/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp >@@ -161,7 +161,8 @@ void UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstrai > auto source = sourceOrError.source(); > source->setIsRemote(true); > settings = source->settings(); >- m_proxies.set(id, std::make_unique<SourceProxy>(id, *this, WTFMove(source))); >+ ASSERT(!m_proxies.contains(id)); >+ m_proxies.add(id, std::make_unique<SourceProxy>(id, *this, WTFMove(source))); > } else > invalidConstraints = WTFMove(sourceOrError.errorMessage); > } >@@ -180,6 +181,11 @@ void UserMediaCaptureManagerProxy::stopProducingData(uint64_t id) > iter->value->source().stop(); > } > >+void UserMediaCaptureManagerProxy::end(uint64_t id) >+{ >+ m_proxies.remove(id); >+} >+ > void UserMediaCaptureManagerProxy::capabilities(uint64_t id, WebCore::RealtimeMediaSourceCapabilities& capabilities) > { > auto iter = m_proxies.find(id); >@@ -208,6 +214,11 @@ void UserMediaCaptureManagerProxy::applyConstraints(uint64_t id, const WebCore:: > m_process.send(Messages::UserMediaCaptureManager::ApplyConstraintsFailed(id, result.value().first, result.value().second), 0); > } > >+void UserMediaCaptureManagerProxy::clear() >+{ >+ m_proxies.clear(); >+} >+ > } > > #endif >diff --git a/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h b/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h >index 3bf921fe680642fcc76e1fbdabf311ea4eda73fd..a52fea25f4d5c334179214e4213705b491ffff57 100644 >--- a/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h >+++ b/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h >@@ -40,10 +40,11 @@ class WebProcessProxy; > > class UserMediaCaptureManagerProxy : private IPC::MessageReceiver { > public: >- UserMediaCaptureManagerProxy(WebProcessProxy&); >+ explicit UserMediaCaptureManagerProxy(WebProcessProxy&); > ~UserMediaCaptureManagerProxy(); > > WebProcessProxy& process() const { return m_process; } >+ void clear(); > > private: > // IPC::MessageReceiver >@@ -53,6 +54,7 @@ private: > void createMediaSourceForCaptureDeviceWithConstraints(uint64_t id, const WebCore::CaptureDevice& deviceID, String&&, const WebCore::MediaConstraints&, bool& succeeded, String& invalidConstraints, WebCore::RealtimeMediaSourceSettings&); > void startProducingData(uint64_t); > void stopProducingData(uint64_t); >+ void end(uint64_t); > void capabilities(uint64_t, WebCore::RealtimeMediaSourceCapabilities&); > void setMuted(uint64_t, bool); > void applyConstraints(uint64_t, const WebCore::MediaConstraints&); >diff --git a/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in b/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in >index 20db1762fb1682a92447e4788526545f897f9ab6..2a26de7d718e1510e01ea8f4a5e8f7e0c00f0b91 100644 >--- a/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in >+++ b/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in >@@ -27,6 +27,7 @@ messages -> UserMediaCaptureManagerProxy { > CreateMediaSourceForCaptureDeviceWithConstraints(uint64_t id, WebCore::CaptureDevice device, String hashSalt, struct WebCore::MediaConstraints constraints) -> (bool success, String invalidConstraints, WebCore::RealtimeMediaSourceSettings settings) LegacySync > StartProducingData(uint64_t id) > StopProducingData(uint64_t id) >+ End(uint64_t id) > Capabilities(uint64_t id) -> (WebCore::RealtimeMediaSourceCapabilities capabilities) LegacySync > SetMuted(uint64_t id, bool muted) > ApplyConstraints(uint64_t id, struct WebCore::MediaConstraints constraints) >diff --git a/Source/WebKit/UIProcess/WebProcessProxy.cpp b/Source/WebKit/UIProcess/WebProcessProxy.cpp >index b769d53206ebde70c19279ce250396715db4e377..ace34d5b31166dc22061df9ea5c5c0ea74a3c834 100644 >--- a/Source/WebKit/UIProcess/WebProcessProxy.cpp >+++ b/Source/WebKit/UIProcess/WebProcessProxy.cpp >@@ -571,6 +571,10 @@ void WebProcessProxy::processDidTerminateOrFailedToLaunch() > // to be deleted before we can finish our work. > Ref<WebProcessProxy> protect(*this); > >+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM) >+ m_userMediaCaptureManagerProxy->clear(); >+#endif >+ > if (auto* webConnection = this->webConnection()) > webConnection->didClose(); > >diff --git a/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp b/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp >index 45b901e8ac4d908dcafbda016e53adcff8b7eaea..34bd80dac2eb565ab6a105daed3a8b6f4fe4711d 100644 >--- a/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp >+++ b/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp >@@ -185,6 +185,7 @@ private: > // RealtimeMediaSource > void beginConfiguration() final { } > void commitConfiguration() final { } >+ void hasEnded() final { m_manager.sourceEnded(m_id); } > > void applyConstraints(const WebCore::MediaConstraints& constraints, SuccessHandler&& successHandler, FailureHandler&& failureHandler) final { > m_manager.applyConstraints(m_id, constraints); >@@ -345,6 +346,11 @@ void UserMediaCaptureManager::applyConstraints(uint64_t id, const WebCore::Media > m_process.send(Messages::UserMediaCaptureManagerProxy::ApplyConstraints(id, constraints), 0); > } > >+void UserMediaCaptureManager::sourceEnded(uint64_t id) >+{ >+ m_process.send(Messages::UserMediaCaptureManagerProxy::End(id), 0); >+} >+ > void UserMediaCaptureManager::applyConstraintsSucceeded(uint64_t id, const WebCore::RealtimeMediaSourceSettings& settings) > { > ASSERT(m_sources.contains(id)); >diff --git a/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h b/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h >index ad1be7ccedd6ae4308fc4fef028c377b4a9e0bd0..83404fa6edcf51b464e64e05f90a1adc83ef18e8 100644 >--- a/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h >+++ b/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h >@@ -85,6 +85,7 @@ private: > // Messages::UserMediaCaptureManager > void captureFailed(uint64_t id); > void sourceStopped(uint64_t id); >+ void sourceEnded(uint64_t id); > void sourceMutedChanged(uint64_t id, bool muted); > void sourceSettingsChanged(uint64_t id, const WebCore::RealtimeMediaSourceSettings&); > void storageChanged(uint64_t id, const SharedMemory::Handle&, const WebCore::CAAudioStreamDescription&, uint64_t numberOfFrames);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 194312
:
361232
|
361347
| 361412