Diff
Modified: trunk/Source/WebKit/ChangeLog (272904 => 272905)
--- trunk/Source/WebKit/ChangeLog 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/ChangeLog 2021-02-16 16:10:54 UTC (rev 272905)
@@ -1,3 +1,67 @@
+2021-02-16 Kimmo Kinnunen <kkinnu...@apple.com>
+
+ ThreadMessageReceiverRefCounted subclasses are accessed in non-thread-safe way
+ https://bugs.webkit.org/show_bug.cgi?id=221891
+
+ Reviewed by Chris Dumez.
+
+ For each ThreadMessageReceiverRefCounted subclass, remove calls
+ to Connection::addThreadMessageReceiver() from the constructor.
+ The calls pass 'this' as the ThreadMessageReceiver*. If the
+ connection tries to dispatch a message during the constructor, this
+ results in some or all of below:
+ - non-thread-safe read of mutated virtual function pointer
+ - call to incorrect member function, mostly to MessageReceiver::didReceiveMessage
+ - an assert from above
+ - skipped message
+
+ For each ThreadMessageReceiverRefCounted subclass, remove calls
+ to Connection::removeThreadMessageReceiver() from the destructor.
+ The message receive destination is still active during destructor,
+ so Connection might dispatch new message tasks during that time.
+ This causes ref of the instance already being destroyed, which
+ then causes the tasks to use deleted instance and then later
+ deleting it again.
+
+ Does not try to fix any other potential thread-related issues in
+ the modified areas.
+
+ * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp:
+ (WebKit::RemoteAudioMediaStreamTrackRendererManager::RemoteAudioMediaStreamTrackRendererManager):
+ (WebKit::RemoteAudioMediaStreamTrackRendererManager::startListeningForIPC):
+ (WebKit::RemoteAudioMediaStreamTrackRendererManager::close):
+ * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h:
+ * GPUProcess/webrtc/RemoteSampleBufferDisplayLayerManager.cpp:
+ (WebKit::RemoteSampleBufferDisplayLayerManager::RemoteSampleBufferDisplayLayerManager):
+ (WebKit::RemoteSampleBufferDisplayLayerManager::startListeningForIPC):
+ (WebKit::RemoteSampleBufferDisplayLayerManager::close):
+ * GPUProcess/webrtc/RemoteSampleBufferDisplayLayerManager.h:
+ * NetworkProcess/webrtc/NetworkRTCProvider.cpp:
+ (WebKit::NetworkRTCProvider::NetworkRTCProvider):
+ (WebKit::NetworkRTCProvider::startListeningForIPC):
+ * NetworkProcess/webrtc/NetworkRTCProvider.h:
+ (WebKit::NetworkRTCProvider::create):
+ * WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp:
+ (WebKit::LibWebRTCCodecs::LibWebRTCCodecs):
+ (WebKit::LibWebRTCCodecs::startListeningForIPC):
+ (WebKit::LibWebRTCCodecs::~LibWebRTCCodecs):
+ (WebKit::LibWebRTCCodecs::gpuProcessConnectionDidClose):
+ * WebProcess/GPU/webrtc/LibWebRTCCodecs.h:
+ (WebKit::LibWebRTCCodecs::create):
+ * WebProcess/Network/webrtc/LibWebRTCNetwork.cpp:
+ (WebKit::LibWebRTCNetwork::~LibWebRTCNetwork):
+ * WebProcess/Network/webrtc/LibWebRTCNetwork.h:
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::libWebRTCCodecs):
+ * WebProcess/cocoa/RemoteCaptureSampleManager.cpp:
+ (WebKit::RemoteCaptureSampleManager::~RemoteCaptureSampleManager):
+ (WebKit::RemoteCaptureSampleManager::stopListeningForIPC):
+ * WebProcess/cocoa/RemoteCaptureSampleManager.h:
+ * WebProcess/cocoa/UserMediaCaptureManager.cpp:
+ (WebKit::UserMediaCaptureManager::~UserMediaCaptureManager):
+ * WebProcess/glib/UserMediaCaptureManager.cpp:
+ (WebKit::UserMediaCaptureManager::~UserMediaCaptureManager):
+
2021-02-16 Youenn Fablet <you...@apple.com>
Enable GPU WebRTC codecs in GPUProcess by default on iOS
Modified: trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp (272904 => 272905)
--- trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp 2021-02-16 16:10:54 UTC (rev 272905)
@@ -41,18 +41,20 @@
: m_connectionToWebProcess(connectionToWebProcess)
, m_queue(connectionToWebProcess.gpuProcess().audioMediaStreamTrackRendererQueue())
{
+}
+
+void RemoteAudioMediaStreamTrackRendererManager::startListeningForIPC()
+{
m_connectionToWebProcess.connection().addThreadMessageReceiver(Messages::RemoteAudioMediaStreamTrackRenderer::messageReceiverName(), this);
m_connectionToWebProcess.connection().addThreadMessageReceiver(Messages::RemoteAudioMediaStreamTrackRendererManager::messageReceiverName(), this);
}
-RemoteAudioMediaStreamTrackRendererManager::~RemoteAudioMediaStreamTrackRendererManager()
+RemoteAudioMediaStreamTrackRendererManager::~RemoteAudioMediaStreamTrackRendererManager() = default;
+
+void RemoteAudioMediaStreamTrackRendererManager::close()
{
m_connectionToWebProcess.connection().removeThreadMessageReceiver(Messages::RemoteAudioMediaStreamTrackRenderer::messageReceiverName());
m_connectionToWebProcess.connection().removeThreadMessageReceiver(Messages::RemoteAudioMediaStreamTrackRendererManager::messageReceiverName());
-}
-
-void RemoteAudioMediaStreamTrackRendererManager::close()
-{
dispatchToThread([this, protectedThis = makeRef(*this)] {
m_renderers.clear();
});
Modified: trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h (272904 => 272905)
--- trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h 2021-02-16 16:10:54 UTC (rev 272905)
@@ -45,7 +45,12 @@
class RemoteAudioMediaStreamTrackRendererManager final : public IPC::Connection::ThreadMessageReceiverRefCounted {
WTF_MAKE_FAST_ALLOCATED;
public:
- static Ref<RemoteAudioMediaStreamTrackRendererManager> create(GPUConnectionToWebProcess& process) { return adoptRef(*new RemoteAudioMediaStreamTrackRendererManager(process)); }
+ static Ref<RemoteAudioMediaStreamTrackRendererManager> create(GPUConnectionToWebProcess& process)
+ {
+ auto instance = adoptRef(*new RemoteAudioMediaStreamTrackRendererManager(process));
+ instance->startListeningForIPC();
+ return instance;
+ }
~RemoteAudioMediaStreamTrackRendererManager();
void didReceiveRendererMessage(IPC::Connection&, IPC::Decoder&);
@@ -57,6 +62,7 @@
private:
explicit RemoteAudioMediaStreamTrackRendererManager(GPUConnectionToWebProcess&);
+ void startListeningForIPC();
// IPC::Connection::ThreadMessageReceiver
void dispatchToThread(Function<void()>&&) final;
Modified: trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayerManager.cpp (272904 => 272905)
--- trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayerManager.cpp 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayerManager.cpp 2021-02-16 16:10:54 UTC (rev 272905)
@@ -43,18 +43,20 @@
, m_connection(gpuConnectionToWebProcess.connection())
, m_queue(gpuConnectionToWebProcess.gpuProcess().videoMediaStreamTrackRendererQueue())
{
+}
+
+void RemoteSampleBufferDisplayLayerManager::startListeningForIPC()
+{
m_connectionToWebProcess.connection().addThreadMessageReceiver(Messages::RemoteSampleBufferDisplayLayer::messageReceiverName(), this);
m_connectionToWebProcess.connection().addThreadMessageReceiver(Messages::RemoteSampleBufferDisplayLayerManager::messageReceiverName(), this);
}
-RemoteSampleBufferDisplayLayerManager::~RemoteSampleBufferDisplayLayerManager()
+RemoteSampleBufferDisplayLayerManager::~RemoteSampleBufferDisplayLayerManager() = default;
+
+void RemoteSampleBufferDisplayLayerManager::close()
{
m_connectionToWebProcess.connection().removeThreadMessageReceiver(Messages::RemoteSampleBufferDisplayLayer::messageReceiverName());
m_connectionToWebProcess.connection().removeThreadMessageReceiver(Messages::RemoteSampleBufferDisplayLayerManager::messageReceiverName());
-}
-
-void RemoteSampleBufferDisplayLayerManager::close()
-{
dispatchToThread([this, protectedThis = makeRef(*this)] {
callOnMainThread([layers = WTFMove(m_layers)] { });
});
Modified: trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayerManager.h (272904 => 272905)
--- trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayerManager.h 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayerManager.h 2021-02-16 16:10:54 UTC (rev 272905)
@@ -49,7 +49,12 @@
class RemoteSampleBufferDisplayLayerManager final : public IPC::Connection::ThreadMessageReceiverRefCounted {
WTF_MAKE_FAST_ALLOCATED;
public:
- static Ref<RemoteSampleBufferDisplayLayerManager> create(GPUConnectionToWebProcess& connection) { return adoptRef(*new RemoteSampleBufferDisplayLayerManager(connection)); }
+ static Ref<RemoteSampleBufferDisplayLayerManager> create(GPUConnectionToWebProcess& connection)
+ {
+ auto instance = adoptRef(*new RemoteSampleBufferDisplayLayerManager(connection));
+ instance->startListeningForIPC();
+ return instance;
+ }
~RemoteSampleBufferDisplayLayerManager();
void close();
@@ -56,6 +61,7 @@
private:
explicit RemoteSampleBufferDisplayLayerManager(GPUConnectionToWebProcess&);
+ void startListeningForIPC();
// IPC::Connection::ThreadMessageReceiver
void dispatchToThread(Function<void()>&&) final;
Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp (272904 => 272905)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp 2021-02-16 16:10:54 UTC (rev 272905)
@@ -93,6 +93,10 @@
#if !RELEASE_LOG_DISABLED
rtc::LogMessage::SetLogOutput(WebKit2LogWebRTC.state == WTFLogChannelState::On ? rtc::LS_INFO : rtc::LS_WARNING, doReleaseLogging);
#endif
+}
+
+void NetworkRTCProvider::startListeningForIPC()
+{
m_connection->connection().addThreadMessageReceiver(Messages::NetworkRTCProvider::messageReceiverName(), this);
}
Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h (272904 => 272905)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h 2021-02-16 16:10:54 UTC (rev 272905)
@@ -62,7 +62,12 @@
class NetworkRTCProvider : public rtc::MessageHandler, public IPC::Connection::ThreadMessageReceiverRefCounted {
public:
- static Ref<NetworkRTCProvider> create(NetworkConnectionToWebProcess& connection) { return adoptRef(*new NetworkRTCProvider(connection)); }
+ static Ref<NetworkRTCProvider> create(NetworkConnectionToWebProcess& connection)
+ {
+ auto instance = adoptRef(*new NetworkRTCProvider(connection));
+ instance->startListeningForIPC();
+ return instance;
+ }
~NetworkRTCProvider();
void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
@@ -99,6 +104,7 @@
private:
explicit NetworkRTCProvider(NetworkConnectionToWebProcess&);
+ void startListeningForIPC();
void createUDPSocket(WebCore::LibWebRTCSocketIdentifier, const RTCNetwork::SocketAddress&, uint16_t, uint16_t);
void createClientTCPSocket(WebCore::LibWebRTCSocketIdentifier, const RTCNetwork::SocketAddress&, const RTCNetwork::SocketAddress&, String&& userAgent, int);
Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp (272904 => 272905)
--- trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp 2021-02-16 16:10:54 UTC (rev 272905)
@@ -166,9 +166,13 @@
LibWebRTCCodecs::LibWebRTCCodecs()
: m_queue(WorkQueue::create("LibWebRTCCodecs", WorkQueue::Type::Serial, WorkQueue::QOS::UserInteractive))
{
+}
+
+void LibWebRTCCodecs::startListeningForIPC()
+{
+ ASSERT(!m_connection);
auto& gpuConnection = WebProcess::singleton().ensureGPUProcessConnection();
gpuConnection.addClient(*this);
-
m_connection = makeRef(gpuConnection.connection());
m_connection->addThreadMessageReceiver(Messages::LibWebRTCCodecs::messageReceiverName(), this);
}
@@ -175,8 +179,7 @@
LibWebRTCCodecs::~LibWebRTCCodecs()
{
- if (m_connection)
- m_connection->removeThreadMessageReceiver(Messages::LibWebRTCCodecsProxy::messageReceiverName());
+ ASSERT_NOT_REACHED();
}
void LibWebRTCCodecs::setCallbacks(bool useGPUProcess)
@@ -461,30 +464,28 @@
void LibWebRTCCodecs::gpuProcessConnectionDidClose(GPUProcessConnection&)
{
- LockHolder holder(m_connectionLock);
-
- if (m_connection)
- m_connection->removeThreadMessageReceiver(Messages::LibWebRTCCodecs::messageReceiverName());
-
auto& gpuConnection = WebProcess::singleton().ensureGPUProcessConnection();
gpuConnection.addClient(*this);
- gpuConnection.connection().addThreadMessageReceiver(Messages::LibWebRTCCodecs::messageReceiverName(), this);
+ {
+ auto lock = holdLock(m_connectionLock);
+ m_connection->removeThreadMessageReceiver(Messages::LibWebRTCCodecsProxy::messageReceiverName());
+ m_connection = makeRef(gpuConnection.connection());
+ m_connection->addThreadMessageReceiver(Messages::LibWebRTCCodecs::messageReceiverName(), this);
+ }
- dispatchToThread([this, connection = makeRef(gpuConnection.connection())] {
+ dispatchToThread([this]() {
// Lock everything so that we can update encoder/decoder connection.
LockHolder holder(m_connectionLock);
-
- m_connection = connection.ptr();
// Recreate encoders and initialize them, recreate decoders.
for (auto& encoder : m_encoders.values()) {
- connection->send(Messages::LibWebRTCCodecsProxy::CreateEncoder { encoder->identifier, formatNameFromWebRTCCodecType(encoder->codecType), encoder->parameters, RuntimeEnabledFeatures::sharedFeatures().webRTCH264LowLatencyEncoderEnabled() }, 0);
+ m_connection->send(Messages::LibWebRTCCodecsProxy::CreateEncoder { encoder->identifier, formatNameFromWebRTCCodecType(encoder->codecType), encoder->parameters, RuntimeEnabledFeatures::sharedFeatures().webRTCH264LowLatencyEncoderEnabled() }, 0);
if (encoder->initializationData)
- connection->send(Messages::LibWebRTCCodecsProxy::InitializeEncoder { encoder->identifier, encoder->initializationData->width, encoder->initializationData->height, encoder->initializationData->startBitRate, encoder->initializationData->maxBitRate, encoder->initializationData->minBitRate, encoder->initializationData->maxFrameRate }, 0);
- encoder->connection = connection.ptr();
+ m_connection->send(Messages::LibWebRTCCodecsProxy::InitializeEncoder { encoder->identifier, encoder->initializationData->width, encoder->initializationData->height, encoder->initializationData->startBitRate, encoder->initializationData->maxBitRate, encoder->initializationData->minBitRate, encoder->initializationData->maxFrameRate }, 0);
+ encoder->connection = m_connection.get();
}
for (auto& decoder : m_decoders.values()) {
- createRemoteDecoder(*decoder, connection.get());
- decoder->connection = connection.ptr();
+ createRemoteDecoder(*decoder, *m_connection);
+ decoder->connection = m_connection.get();
}
});
}
Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.h (272904 => 272905)
--- trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.h 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.h 2021-02-16 16:10:54 UTC (rev 272905)
@@ -62,7 +62,12 @@
class LibWebRTCCodecs : public IPC::Connection::ThreadMessageReceiverRefCounted, public GPUProcessConnection::Client {
WTF_MAKE_FAST_ALLOCATED;
public:
- LibWebRTCCodecs();
+ static std::unique_ptr<LibWebRTCCodecs> create()
+ {
+ auto instance = std::unique_ptr<LibWebRTCCodecs>(new LibWebRTCCodecs);
+ instance->startListeningForIPC();
+ return instance;
+ }
~LibWebRTCCodecs();
static void setCallbacks(bool useGPUProcess);
@@ -110,7 +115,7 @@
int32_t encodeFrame(Encoder&, const webrtc::VideoFrame&, bool shouldEncodeAsKeyFrame);
void registerEncodeFrameCallback(Encoder&, void* encodedImageCallback);
void setEncodeRates(Encoder&, uint32_t bitRate, uint32_t frameRate);
-
+
CVPixelBufferPoolRef pixelBufferPool(size_t width, size_t height, OSType);
void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
@@ -119,6 +124,9 @@
bool supportVP9VTB() const { return m_supportVP9VTB; }
private:
+ LibWebRTCCodecs();
+ void startListeningForIPC();
+
void failedDecoding(RTCDecoderIdentifier);
void completedDecoding(RTCDecoderIdentifier, uint32_t timeStamp, WebCore::RemoteVideoSample&&);
void completedEncoding(RTCEncoderIdentifier, IPC::DataReference&&, const webrtc::WebKitEncodedFrameInfo&);
Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.cpp (272904 => 272905)
--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.cpp 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.cpp 2021-02-16 16:10:54 UTC (rev 272905)
@@ -37,7 +37,7 @@
LibWebRTCNetwork::~LibWebRTCNetwork()
{
- setConnection(nullptr);
+ ASSERT_NOT_REACHED();
}
void LibWebRTCNetwork::setAsActive()
Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.h (272904 => 272905)
--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.h 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.h 2021-02-16 16:10:54 UTC (rev 272905)
@@ -38,7 +38,6 @@
class LibWebRTCNetwork : public IPC::Connection::ThreadMessageReceiverRefCounted {
WTF_MAKE_FAST_ALLOCATED;
public:
- LibWebRTCNetwork() = default;
~LibWebRTCNetwork();
IPC::Connection* connection() { return m_connection.get(); }
Modified: trunk/Source/WebKit/WebProcess/WebProcess.cpp (272904 => 272905)
--- trunk/Source/WebKit/WebProcess/WebProcess.cpp 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/WebProcess/WebProcess.cpp 2021-02-16 16:10:54 UTC (rev 272905)
@@ -1193,7 +1193,7 @@
LibWebRTCCodecs& WebProcess::libWebRTCCodecs()
{
if (!m_libWebRTCCodecs)
- m_libWebRTCCodecs = makeUnique<LibWebRTCCodecs>();
+ m_libWebRTCCodecs = LibWebRTCCodecs::create();
return *m_libWebRTCCodecs;
}
#endif
Modified: trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp (272904 => 272905)
--- trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp 2021-02-16 16:10:54 UTC (rev 272905)
@@ -46,6 +46,11 @@
RemoteCaptureSampleManager::~RemoteCaptureSampleManager()
{
+ ASSERT(!m_connection);
+}
+
+void RemoteCaptureSampleManager::stopListeningForIPC()
+{
if (m_isRegisteredToParentProcessConnection)
WebProcess::singleton().parentProcessConnection()->removeThreadMessageReceiver(Messages::RemoteCaptureSampleManager::messageReceiverName());
setConnection(nullptr);
Modified: trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h (272904 => 272905)
--- trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h 2021-02-16 16:10:54 UTC (rev 272905)
@@ -50,6 +50,7 @@
public:
RemoteCaptureSampleManager();
~RemoteCaptureSampleManager();
+ void stopListeningForIPC();
void addSource(Ref<RemoteRealtimeAudioSource>&&);
void addSource(Ref<RemoteRealtimeVideoSource>&&);
Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (272904 => 272905)
--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp 2021-02-16 15:18:49 UTC (rev 272904)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp 2021-02-16 16:10:54 UTC (rev 272905)
@@ -60,6 +60,7 @@
RealtimeMediaSourceCenter::singleton().unsetDisplayCaptureFactory(m_displayFactory);
RealtimeMediaSourceCenter::singleton().unsetVideoCaptureFactory(m_videoFactory);
m_process.removeMessageReceiver(Messages::UserMediaCaptureManager::messageReceiverName());
+ m_remoteCaptureSampleManager.stopListeningForIPC();
}
const char* UserMediaCaptureManager::supplementName()