gecko-dev/ipc/glue/SerializedStructuredCloneBuffer.h
Nika Layzell 1c5879a78a Bug 1783242 - Part 1: Serialize large JSStructuredCloneData with SharedMemory, r=ipc-reviewers,handyman
This changes the serialization strategy for JSStructuredCloneData to use shared
memory if the total size exceeds 64k. This doesn't change how it is represented
when it is within source or destination processes, just how it is represented
when in transit.

Differential Revision: https://phabricator.services.mozilla.com/D153804
2022-09-28 19:25:13 +00:00

88 lines
2.5 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 __IPC_GLUE_SERIALIZEDSTRUCTUREDCLONEBUFFER_H__
#define __IPC_GLUE_SERIALIZEDSTRUCTUREDCLONEBUFFER_H__
#include <algorithm>
#include <cstdint>
#include <cstdlib>
#include <string>
#include <utility>
#include "chrome/common/ipc_message.h"
#include "chrome/common/ipc_message_utils.h"
#include "js/AllocPolicy.h"
#include "js/StructuredClone.h"
#include "mozilla/Assertions.h"
#include "mozilla/BufferList.h"
#include "mozilla/Vector.h"
#include "mozilla/mozalloc.h"
class PickleIterator;
namespace mozilla {
template <typename...>
class Variant;
namespace detail {
template <typename...>
struct VariantTag;
}
} // namespace mozilla
namespace mozilla {
struct SerializedStructuredCloneBuffer final {
SerializedStructuredCloneBuffer() = default;
SerializedStructuredCloneBuffer(SerializedStructuredCloneBuffer&&) = default;
SerializedStructuredCloneBuffer& operator=(
SerializedStructuredCloneBuffer&&) = default;
SerializedStructuredCloneBuffer(const SerializedStructuredCloneBuffer&) =
delete;
SerializedStructuredCloneBuffer& operator=(
const SerializedStructuredCloneBuffer& aOther) = delete;
bool operator==(const SerializedStructuredCloneBuffer& aOther) const {
// The copy assignment operator and the equality operator are
// needed by the IPDL generated code. We relied on the copy
// assignment operator at some places but we never use the
// equality operator.
return false;
}
JSStructuredCloneData data{JS::StructuredCloneScope::Unassigned};
};
} // namespace mozilla
namespace IPC {
template <>
struct ParamTraits<JSStructuredCloneData> {
typedef JSStructuredCloneData paramType;
static void Write(MessageWriter* aWriter, const paramType& aParam);
static bool Read(MessageReader* aReader, paramType* aResult);
};
template <>
struct ParamTraits<mozilla::SerializedStructuredCloneBuffer> {
typedef mozilla::SerializedStructuredCloneBuffer paramType;
static void Write(MessageWriter* aWriter, const paramType& aParam) {
WriteParam(aWriter, aParam.data);
}
static bool Read(MessageReader* aReader, paramType* aResult) {
return ReadParam(aReader, &aResult->data);
}
};
} // namespace IPC
#endif /* __IPC_GLUE_SERIALIZEDSTRUCTUREDCLONEBUFFER_H__ */