forked from mirrors/gecko-dev
Using ipc::Shmem causes unbounded shmem use growth until e.g. a Worker yields to the event loop. If a Worker never yields, Shmems sent to WebGLParent are never released. Specifically the manager (PCanvasManager) for WebGLParent calls DestroySharedMemory, which sends/enqueues for WebGLChild's manager a matching call to ShmemDestroyed. However, while WebGLChild refuses to spin its event loop (such as a no-return WASM Worker), the ShmemDestroyed events will just pile up. Closing e.g. the tab frees the shmems, but they accumulate unbounded until the Worker yields to the event loop. This is true for other users of ipc::Shmem (or RaiiShmem) as well, but entrypoints other than DispatchCommands are rarer and can be handled later similarly. Differential Revision: https://phabricator.services.mozilla.com/D162946
57 lines
1.5 KiB
C++
57 lines
1.5 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef WEBGLCHILD_H_
|
|
#define WEBGLCHILD_H_
|
|
|
|
#include "mozilla/dom/PWebGLChild.h"
|
|
#include "mozilla/ipc/BigBuffer.h"
|
|
#include "mozilla/WeakPtr.h"
|
|
|
|
#include <string>
|
|
|
|
namespace mozilla {
|
|
|
|
class ClientWebGLContext;
|
|
|
|
namespace dom {
|
|
|
|
struct FlushedCmdInfo final {
|
|
size_t flushes = 0;
|
|
size_t flushedCmdBytes = 0;
|
|
size_t overhead = 0;
|
|
};
|
|
|
|
class WebGLChild final : public PWebGLChild, public SupportsWeakPtr {
|
|
const WeakPtr<ClientWebGLContext> mContext;
|
|
const size_t mDefaultCmdsShmemSize;
|
|
mozilla::ipc::BigBuffer mPendingCmdsShmem;
|
|
size_t mPendingCmdsPos = 0;
|
|
size_t mPendingCmdsAlignmentOverhead = 0;
|
|
FlushedCmdInfo mFlushedCmdInfo;
|
|
|
|
public:
|
|
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WebGLChild, override);
|
|
|
|
explicit WebGLChild(ClientWebGLContext&);
|
|
|
|
Maybe<Range<uint8_t>> AllocPendingCmdBytes(size_t,
|
|
size_t fyiAlignmentOverhead);
|
|
void FlushPendingCmds();
|
|
void ActorDestroy(ActorDestroyReason why) override;
|
|
|
|
private:
|
|
friend PWebGLChild;
|
|
virtual ~WebGLChild();
|
|
|
|
public:
|
|
mozilla::ipc::IPCResult RecvJsWarning(const std::string&) const;
|
|
mozilla::ipc::IPCResult RecvOnContextLoss(webgl::ContextLossReason) const;
|
|
};
|
|
|
|
} // namespace dom
|
|
} // namespace mozilla
|
|
|
|
#endif // WEBGLCHILD_H_
|