blob: 0a5b946ed466bbe2cb7cfedb814f8cdb868be651 [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"
namespace mri {
SharedMemoryProvider::SharedMemoryProvider(
bool read_only, mojo::edk::ScopedPlatformHandle* scoped_handle,
uint32_t memory_size_in_bytes) {
base::SharedMemoryHandle memory_handle(
base::FileDescriptor(scoped_handle->release().handle, true));
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) {
mojo::edk::ScopedPlatformHandle scoped_platform_handle;
MojoResult mojo_result = mojo::edk::PassWrappedPlatformHandle(
fd_handle.release().value(), &scoped_platform_handle);
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, &scoped_platform_handle, 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