1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "mozilla/ipc/ProtocolUtils.h"
9 namespace mozilla::ipc
{
11 UnsafeSharedMemoryHandle::UnsafeSharedMemoryHandle()
12 : mHandle(ipc::SharedMemory::NULLHandle()), mSize(0) {}
14 UnsafeSharedMemoryHandle::UnsafeSharedMemoryHandle(
15 UnsafeSharedMemoryHandle
&& aOther
) noexcept
16 : mHandle(std::move(aOther
.mHandle
)), mSize(aOther
.mSize
) {
17 aOther
.mHandle
= ipc::SharedMemory::NULLHandle();
21 UnsafeSharedMemoryHandle
& UnsafeSharedMemoryHandle::operator=(
22 UnsafeSharedMemoryHandle
&& aOther
) noexcept
{
23 if (this == &aOther
) {
27 mHandle
= std::move(aOther
.mHandle
);
29 aOther
.mHandle
= ipc::SharedMemory::NULLHandle();
34 Maybe
<std::pair
<UnsafeSharedMemoryHandle
, WritableSharedMemoryMapping
>>
35 UnsafeSharedMemoryHandle::CreateAndMap(size_t aSize
) {
37 return Some(std::make_pair(UnsafeSharedMemoryHandle(),
38 WritableSharedMemoryMapping()));
41 RefPtr
<ipc::SharedMemory
> shm
= MakeAndAddRef
<ipc::SharedMemory
>();
42 if (NS_WARN_IF(!shm
->Create(aSize
)) || NS_WARN_IF(!shm
->Map(aSize
))) {
46 auto handle
= shm
->TakeHandle();
48 auto size
= shm
->Size();
50 return Some(std::make_pair(UnsafeSharedMemoryHandle(std::move(handle
), size
),
51 WritableSharedMemoryMapping(std::move(shm
))));
54 WritableSharedMemoryMapping::WritableSharedMemoryMapping(
55 RefPtr
<ipc::SharedMemory
>&& aRef
)
58 Maybe
<WritableSharedMemoryMapping
> WritableSharedMemoryMapping::Open(
59 UnsafeSharedMemoryHandle aHandle
) {
60 if (aHandle
.mSize
== 0) {
61 return Some(WritableSharedMemoryMapping(nullptr));
64 RefPtr
<ipc::SharedMemory
> shm
= MakeAndAddRef
<ipc::SharedMemory
>();
65 if (NS_WARN_IF(!shm
->SetHandle(std::move(aHandle
.mHandle
),
66 ipc::SharedMemory::RightsReadWrite
)) ||
67 NS_WARN_IF(!shm
->Map(aHandle
.mSize
))) {
73 return Some(WritableSharedMemoryMapping(std::move(shm
)));
76 size_t WritableSharedMemoryMapping::Size() const {
84 Span
<uint8_t> WritableSharedMemoryMapping::Bytes() {
86 return Span
<uint8_t>();
89 uint8_t* mem
= static_cast<uint8_t*>(mRef
->Memory());
90 return Span(mem
, mRef
->Size());
93 } // namespace mozilla::ipc
96 auto ParamTraits
<mozilla::ipc::UnsafeSharedMemoryHandle
>::Write(
97 IPC::MessageWriter
* aWriter
, paramType
&& aVar
) -> void {
98 IPC::WriteParam(aWriter
, std::move(aVar
.mHandle
));
99 IPC::WriteParam(aWriter
, aVar
.mSize
);
102 auto ParamTraits
<mozilla::ipc::UnsafeSharedMemoryHandle
>::Read(
103 IPC::MessageReader
* aReader
, paramType
* aVar
) -> bool {
104 return IPC::ReadParam(aReader
, &aVar
->mHandle
) &&
105 IPC::ReadParam(aReader
, &aVar
->mSize
);