blob: bc28fcdc6c67eae6e0b0352f8a80f0b60e443d6c [file] [log] [blame]
// Copyright 2022 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ipcz/driver_memory.h"
#include <algorithm>
#include <cstdint>
#include <limits>
#include <utility>
#include "ipcz/ipcz.h"
#include "third_party/abseil-cpp/absl/base/macros.h"
namespace ipcz {
DriverMemory::DriverMemory() = default;
DriverMemory::DriverMemory(DriverObject memory) : memory_(std::move(memory)) {
if (memory_.is_valid()) {
IpczSharedMemoryInfo info = {.size = sizeof(info)};
IpczResult result = memory_.driver()->GetSharedMemoryInfo(
memory_.handle(), IPCZ_NO_FLAGS, nullptr, &info);
ABSL_ASSERT(result == IPCZ_RESULT_OK);
size_ = info.region_num_bytes;
}
}
DriverMemory::DriverMemory(const IpczDriver& driver, size_t num_bytes)
: size_(num_bytes) {
ABSL_ASSERT(num_bytes > 0);
IpczDriverHandle handle;
IpczResult result =
driver.AllocateSharedMemory(num_bytes, IPCZ_NO_FLAGS, nullptr, &handle);
ABSL_ASSERT(result == IPCZ_RESULT_OK);
memory_ = DriverObject(driver, handle);
}
DriverMemory::DriverMemory(DriverMemory&& other) = default;
DriverMemory& DriverMemory::operator=(DriverMemory&& other) = default;
DriverMemory::~DriverMemory() = default;
DriverMemory DriverMemory::Clone() {
ABSL_ASSERT(is_valid());
IpczDriverHandle handle;
IpczResult result = memory_.driver()->DuplicateSharedMemory(
memory_.handle(), 0, nullptr, &handle);
ABSL_ASSERT(result == IPCZ_RESULT_OK);
return DriverMemory(DriverObject(*memory_.driver(), handle));
}
DriverMemoryMapping DriverMemory::Map() {
ABSL_ASSERT(is_valid());
void* address;
IpczDriverHandle mapping_handle;
IpczResult result = memory_.driver()->MapSharedMemory(
memory_.handle(), 0, nullptr, &address, &mapping_handle);
ABSL_ASSERT(result == IPCZ_RESULT_OK);
return DriverMemoryMapping(*memory_.driver(), mapping_handle, address, size_);
}
DriverMemoryWithMapping::DriverMemoryWithMapping() = default;
DriverMemoryWithMapping::DriverMemoryWithMapping(DriverMemory memory,
DriverMemoryMapping mapping)
: memory(std::move(memory)), mapping(std::move(mapping)) {}
DriverMemoryWithMapping::DriverMemoryWithMapping(DriverMemoryWithMapping&&) =
default;
DriverMemoryWithMapping& DriverMemoryWithMapping::operator=(
DriverMemoryWithMapping&&) = default;
DriverMemoryWithMapping::~DriverMemoryWithMapping() = default;
} // namespace ipcz