// 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 /* 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) {
  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
