fune/dom/canvas/WebGLChild.h
Kelsey Gilbert 7671a9d5a4 Bug 1801021 - Use BigBuffer for DispatchCommands. r=gfx-reviewers,lsalzman
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
2022-11-25 22:20:38 +00:00

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_