⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 276212 in webkit


Ignore:
Timestamp:
Apr 17, 2021, 4:22:13 PM (5 years ago)
Author:
Chris Dumez
Message:

RemoteImageDecoderAVFManager should never re-launch the GPUProcess on destruction
https://bugs.webkit.org/show_bug.cgi?id=224723

Reviewed by Darin Adler.

RemoteImageDecoderAVFManager was calling ensureGPUProcessConnection() it is destructor,
just to remove itself as an IPC message receiver. This means it could unnecessarily
relaunch the GPUProcess. This patch addresses that.

This patch also makes it so that RemoteImageDecoderAVFManager registers itself as a
client of the GPUProcessConnection, so that it gets notified when the connection gets
severed. Right now, I only do very basic crash handling but this paves the way to do
better in the future. I did fix a bug where the RemoteImageDecoderAVFManager would
not re-register itself as a message receiver after a GPUProcess re-launch.

  • WebProcess/GPU/media/RemoteImageDecoderAVF.cpp:

(WebKit::RemoteImageDecoderAVF::RemoteImageDecoderAVF):

  • WebProcess/GPU/media/RemoteImageDecoderAVFManager.cpp:

(WebKit::RemoteImageDecoderAVFManager::createImageDecoder):
(WebKit::RemoteImageDecoderAVFManager::deleteRemoteImageDecoder):
(WebKit::RemoteImageDecoderAVFManager::~RemoteImageDecoderAVFManager):
(WebKit::RemoteImageDecoderAVFManager::gpuProcessConnectionDidClose):
(WebKit::RemoteImageDecoderAVFManager::ensureGPUProcessConnection):
(WebKit::RemoteImageDecoderAVFManager::gpuProcessConnection const): Deleted.

  • WebProcess/GPU/media/RemoteImageDecoderAVFManager.h:
Location:
trunk/Source/WebKit
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r276209 r276212  
     12021-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
    1292021-04-17  Tyler Wilcock  <twilco.o@protonmail.com>
    230
  • trunk/Source/WebKit/WebProcess/GPU/media/RemoteImageDecoderAVF.cpp

    r275235 r276212  
    4949RemoteImageDecoderAVF::RemoteImageDecoderAVF(RemoteImageDecoderAVFManager& manager, const WebCore::ImageDecoderIdentifier& identifier, const String& mimeType)
    5050    : ImageDecoder()
    51     , m_gpuProcessConnection(makeWeakPtr(manager.gpuProcessConnection()))
     51    , m_gpuProcessConnection(makeWeakPtr(manager.ensureGPUProcessConnection()))
    5252    , m_manager(manager)
    5353    , m_identifier(identifier)
  • trunk/Source/WebKit/WebProcess/GPU/media/RemoteImageDecoderAVFManager.cpp

    r273615 r276212  
    4242RefPtr<RemoteImageDecoderAVF> RemoteImageDecoderAVFManager::createImageDecoder(SharedBuffer& data, const String& mimeType, AlphaOption alphaOption, GammaAndColorProfileOption gammaAndColorProfileOption)
    4343{
    44     if (!m_messageReceiverInitialized) {
    45         m_messageReceiverInitialized = true;
    46         gpuProcessConnection().messageReceiverMap().addMessageReceiver(Messages::RemoteImageDecoderAVFManager::messageReceiverName(), *this);
    47     }
    48 
    4944    Optional<ImageDecoderIdentifier> imageDecoderIdentifier;
    5045    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))
    5247        return nullptr;
    5348
     
    6459{
    6560    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);
    6763}
    6864
     
    7470RemoteImageDecoderAVFManager::~RemoteImageDecoderAVFManager()
    7571{
    76     gpuProcessConnection().messageReceiverMap().removeMessageReceiver(Messages::RemoteImageDecoderAVFManager::messageReceiverName());
     72    if (m_gpuProcessConnection)
     73        m_gpuProcessConnection->messageReceiverMap().removeMessageReceiver(Messages::RemoteImageDecoderAVFManager::messageReceiverName());
     74}
     75
     76void 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?
    7783}
    7884
     
    8288}
    8389
    84 GPUProcessConnection& RemoteImageDecoderAVFManager::gpuProcessConnection() const
     90GPUProcessConnection& RemoteImageDecoderAVFManager::ensureGPUProcessConnection()
    8591{
    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;
    8798}
    8899
  • trunk/Source/WebKit/WebProcess/GPU/media/RemoteImageDecoderAVFManager.h

    r273615 r276212  
    2929
    3030#include "Connection.h"
     31#include "GPUProcessConnection.h"
    3132#include "MessageReceiver.h"
    3233#include "WebProcessSupplement.h"
     
    3940namespace WebKit {
    4041
    41 class GPUProcessConnection;
    4242class RemoteImageDecoderAVF;
    4343class WebProcess;
    4444
    45 class RemoteImageDecoderAVFManager
     45class RemoteImageDecoderAVFManager final
    4646    : public WebProcessSupplement
     47    , private GPUProcessConnection::Client
    4748    , private IPC::MessageReceiver {
    4849    WTF_MAKE_FAST_ALLOCATED;
     
    5657
    5758    void setUseGPUProcess(bool);
    58     GPUProcessConnection& gpuProcessConnection() const;
     59    GPUProcessConnection& ensureGPUProcessConnection();
    5960
    6061private:
    6162    RefPtr<RemoteImageDecoderAVF> createImageDecoder(WebCore::SharedBuffer& data, const String& mimeType, WebCore::AlphaOption, WebCore::GammaAndColorProfileOption);
     63
     64    // GPUProcessConnection::Client.
     65    void gpuProcessConnectionDidClose(GPUProcessConnection&) final;
    6266
    6367    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
     
    6771
    6872    WebProcess& m_process;
    69     bool m_messageReceiverInitialized { false };
     73    WeakPtr<GPUProcessConnection> m_gpuProcessConnection;
    7074};
    7175
Note: See TracChangeset for help on using the changeset viewer.