blob: d3a89706652d0fb67194f214fa87b90a1729f4da [file] [log] [blame]
// Copyright 2018 The Chromium OS 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 "media_perception/shared_memory_provider.h"
#include <utility>
#include <mojo/public/cpp/system/platform_handle.h>
namespace mri {
SharedMemoryProvider::SharedMemoryProvider(bool read_only,
base::ScopedFD scoped_handle,
uint32_t memory_size_in_bytes) {
base::SharedMemoryHandle memory_handle(
base::FileDescriptor(scoped_handle.release(), true /* auto_close */),
memory_size_in_bytes, base::UnguessableToken::Create());
mapped_size_ = memory_size_in_bytes;
shared_memory_.reset(new base::SharedMemory(memory_handle, read_only));
}
SharedMemoryProvider::~SharedMemoryProvider() {
if (shared_memory_ && shared_memory_->memory()) {
LOG(INFO) << __func__ << ": Unmapping memory for in-process access @"
<< shared_memory_->memory() << '.';
CHECK(shared_memory_->Unmap());
}
}
std::unique_ptr<SharedMemoryProvider>
SharedMemoryProvider::CreateFromRawFileDescriptor(
bool read_only, mojo::ScopedHandle fd_handle,
uint32_t memory_size_in_bytes) {
base::PlatformFile platform_file;
MojoResult mojo_result =
mojo::UnwrapPlatformFile(std::move(fd_handle), &platform_file);
if (mojo_result != MOJO_RESULT_OK) {
LOG(ERROR) << "Failed to unwrap handle: " << mojo_result;
return nullptr;
}
return std::unique_ptr<SharedMemoryProvider>(new SharedMemoryProvider(
read_only, base::ScopedFD(platform_file), memory_size_in_bytes));
}
uint32_t SharedMemoryProvider::GetMemorySizeInBytes() {
return static_cast<uint32_t>(mapped_size_);
}
base::SharedMemory* SharedMemoryProvider::GetSharedMemoryForInProcessAccess() {
if (!shared_memory_->memory()) {
CHECK(shared_memory_->Map(mapped_size_));
LOG(INFO) << __func__ << ": Mapped memory for in-process access @"
<< shared_memory_->memory() << '.';
}
return shared_memory_.get();
}
} // namespace mri