Changeset 276212 in webkit
- Timestamp:
- Apr 17, 2021, 4:22:13 PM (5 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
WebProcess/GPU/media/RemoteImageDecoderAVF.cpp (modified) (1 diff)
-
WebProcess/GPU/media/RemoteImageDecoderAVFManager.cpp (modified) (4 diffs)
-
WebProcess/GPU/media/RemoteImageDecoderAVFManager.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r276209 r276212 1 2021-04-17 Chris Dumez <cdumez@apple.com> 2 3 RemoteImageDecoderAVFManager should never re-launch the GPUProcess on destruction 4 https://bugs.webkit.org/show_bug.cgi?id=224723 5 6 Reviewed by Darin Adler. 7 8 RemoteImageDecoderAVFManager was calling ensureGPUProcessConnection() it is destructor, 9 just to remove itself as an IPC message receiver. This means it could unnecessarily 10 relaunch the GPUProcess. This patch addresses that. 11 12 This patch also makes it so that RemoteImageDecoderAVFManager registers itself as a 13 client of the GPUProcessConnection, so that it gets notified when the connection gets 14 severed. Right now, I only do very basic crash handling but this paves the way to do 15 better in the future. I did fix a bug where the RemoteImageDecoderAVFManager would 16 not re-register itself as a message receiver after a GPUProcess re-launch. 17 18 * WebProcess/GPU/media/RemoteImageDecoderAVF.cpp: 19 (WebKit::RemoteImageDecoderAVF::RemoteImageDecoderAVF): 20 * WebProcess/GPU/media/RemoteImageDecoderAVFManager.cpp: 21 (WebKit::RemoteImageDecoderAVFManager::createImageDecoder): 22 (WebKit::RemoteImageDecoderAVFManager::deleteRemoteImageDecoder): 23 (WebKit::RemoteImageDecoderAVFManager::~RemoteImageDecoderAVFManager): 24 (WebKit::RemoteImageDecoderAVFManager::gpuProcessConnectionDidClose): 25 (WebKit::RemoteImageDecoderAVFManager::ensureGPUProcessConnection): 26 (WebKit::RemoteImageDecoderAVFManager::gpuProcessConnection const): Deleted. 27 * WebProcess/GPU/media/RemoteImageDecoderAVFManager.h: 28 1 29 2021-04-17 Tyler Wilcock <twilco.o@protonmail.com> 2 30 -
trunk/Source/WebKit/WebProcess/GPU/media/RemoteImageDecoderAVF.cpp
r275235 r276212 49 49 RemoteImageDecoderAVF::RemoteImageDecoderAVF(RemoteImageDecoderAVFManager& manager, const WebCore::ImageDecoderIdentifier& identifier, const String& mimeType) 50 50 : ImageDecoder() 51 , m_gpuProcessConnection(makeWeakPtr(manager. gpuProcessConnection()))51 , m_gpuProcessConnection(makeWeakPtr(manager.ensureGPUProcessConnection())) 52 52 , m_manager(manager) 53 53 , m_identifier(identifier) -
trunk/Source/WebKit/WebProcess/GPU/media/RemoteImageDecoderAVFManager.cpp
r273615 r276212 42 42 RefPtr<RemoteImageDecoderAVF> RemoteImageDecoderAVFManager::createImageDecoder(SharedBuffer& data, const String& mimeType, AlphaOption alphaOption, GammaAndColorProfileOption gammaAndColorProfileOption) 43 43 { 44 if (!m_messageReceiverInitialized) {45 m_messageReceiverInitialized = true;46 gpuProcessConnection().messageReceiverMap().addMessageReceiver(Messages::RemoteImageDecoderAVFManager::messageReceiverName(), *this);47 }48 49 44 Optional<ImageDecoderIdentifier> imageDecoderIdentifier; 50 45 IPC::SharedBufferDataReference dataReference { data }; 51 if (! gpuProcessConnection().connection().sendSync(Messages::RemoteImageDecoderAVFProxy::CreateDecoder(dataReference, mimeType), Messages::RemoteImageDecoderAVFProxy::CreateDecoder::Reply(imageDecoderIdentifier), 0))46 if (!ensureGPUProcessConnection().connection().sendSync(Messages::RemoteImageDecoderAVFProxy::CreateDecoder(dataReference, mimeType), Messages::RemoteImageDecoderAVFProxy::CreateDecoder::Reply(imageDecoderIdentifier), 0)) 52 47 return nullptr; 53 48 … … 64 59 { 65 60 m_remoteImageDecoders.take(identifier); 66 gpuProcessConnection().connection().send(Messages::RemoteImageDecoderAVFProxy::DeleteDecoder(identifier), 0); 61 if (m_gpuProcessConnection) 62 m_gpuProcessConnection->connection().send(Messages::RemoteImageDecoderAVFProxy::DeleteDecoder(identifier), 0); 67 63 } 68 64 … … 74 70 RemoteImageDecoderAVFManager::~RemoteImageDecoderAVFManager() 75 71 { 76 gpuProcessConnection().messageReceiverMap().removeMessageReceiver(Messages::RemoteImageDecoderAVFManager::messageReceiverName()); 72 if (m_gpuProcessConnection) 73 m_gpuProcessConnection->messageReceiverMap().removeMessageReceiver(Messages::RemoteImageDecoderAVFManager::messageReceiverName()); 74 } 75 76 void RemoteImageDecoderAVFManager::gpuProcessConnectionDidClose(GPUProcessConnection& connection) 77 { 78 ASSERT(m_gpuProcessConnection == &connection); 79 connection.removeClient(*this); 80 m_gpuProcessConnection->messageReceiverMap().removeMessageReceiver(Messages::RemoteImageDecoderAVFManager::messageReceiverName()); 81 m_gpuProcessConnection = nullptr; 82 // FIXME: Do we need to do more when m_remoteImageDecoders is not empty to re-create them? 77 83 } 78 84 … … 82 88 } 83 89 84 GPUProcessConnection& RemoteImageDecoderAVFManager:: gpuProcessConnection() const90 GPUProcessConnection& RemoteImageDecoderAVFManager::ensureGPUProcessConnection() 85 91 { 86 return m_process.ensureGPUProcessConnection(); 92 if (!m_gpuProcessConnection) { 93 m_gpuProcessConnection = makeWeakPtr(m_process.ensureGPUProcessConnection()); 94 m_gpuProcessConnection->addClient(*this); 95 m_gpuProcessConnection->messageReceiverMap().addMessageReceiver(Messages::RemoteImageDecoderAVFManager::messageReceiverName(), *this); 96 } 97 return *m_gpuProcessConnection; 87 98 } 88 99 -
trunk/Source/WebKit/WebProcess/GPU/media/RemoteImageDecoderAVFManager.h
r273615 r276212 29 29 30 30 #include "Connection.h" 31 #include "GPUProcessConnection.h" 31 32 #include "MessageReceiver.h" 32 33 #include "WebProcessSupplement.h" … … 39 40 namespace WebKit { 40 41 41 class GPUProcessConnection;42 42 class RemoteImageDecoderAVF; 43 43 class WebProcess; 44 44 45 class RemoteImageDecoderAVFManager 45 class RemoteImageDecoderAVFManager final 46 46 : public WebProcessSupplement 47 , private GPUProcessConnection::Client 47 48 , private IPC::MessageReceiver { 48 49 WTF_MAKE_FAST_ALLOCATED; … … 56 57 57 58 void setUseGPUProcess(bool); 58 GPUProcessConnection& gpuProcessConnection() const;59 GPUProcessConnection& ensureGPUProcessConnection(); 59 60 60 61 private: 61 62 RefPtr<RemoteImageDecoderAVF> createImageDecoder(WebCore::SharedBuffer& data, const String& mimeType, WebCore::AlphaOption, WebCore::GammaAndColorProfileOption); 63 64 // GPUProcessConnection::Client. 65 void gpuProcessConnectionDidClose(GPUProcessConnection&) final; 62 66 63 67 void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final; … … 67 71 68 72 WebProcess& m_process; 69 bool m_messageReceiverInitialized { false };73 WeakPtr<GPUProcessConnection> m_gpuProcessConnection; 70 74 }; 71 75
Note:
See TracChangeset
for help on using the changeset viewer.