1// Copyright 2016 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "mojo/public/cpp/system/buffer.h"
6
7namespace mojo {
8
9// static
10ScopedSharedBufferHandle SharedBufferHandle::Create(uint64_t num_bytes) {
11  MojoCreateSharedBufferOptions options = {
12      sizeof(options), MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE};
13  SharedBufferHandle handle;
14  MojoCreateSharedBuffer(&options, num_bytes, handle.mutable_value());
15  return MakeScopedHandle(handle);
16}
17
18ScopedSharedBufferHandle SharedBufferHandle::Clone(
19    SharedBufferHandle::AccessMode access_mode) const {
20  ScopedSharedBufferHandle result;
21  if (!is_valid())
22    return result;
23
24  MojoDuplicateBufferHandleOptions options = {
25      sizeof(options), MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE};
26  if (access_mode == AccessMode::READ_ONLY)
27    options.flags |= MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
28  SharedBufferHandle result_handle;
29  MojoDuplicateBufferHandle(value(), &options, result_handle.mutable_value());
30  result.reset(result_handle);
31  return result;
32}
33
34ScopedSharedBufferMapping SharedBufferHandle::Map(uint64_t size) const {
35  return MapAtOffset(size, 0);
36}
37
38ScopedSharedBufferMapping SharedBufferHandle::MapAtOffset(
39    uint64_t size,
40    uint64_t offset) const {
41  void* buffer = nullptr;
42  MojoMapBuffer(value(), offset, size, &buffer, MOJO_MAP_BUFFER_FLAG_NONE);
43  return ScopedSharedBufferMapping(buffer);
44}
45
46}  // namespace mojo
47