xref: /aosp_15_r20/external/libchrome/mojo/public/cpp/system/buffer.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2016 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "mojo/public/cpp/system/buffer.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker namespace mojo {
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker // static
Create(uint64_t num_bytes)10*635a8641SAndroid Build Coastguard Worker ScopedSharedBufferHandle SharedBufferHandle::Create(uint64_t num_bytes) {
11*635a8641SAndroid Build Coastguard Worker   MojoCreateSharedBufferOptions options = {sizeof(options),
12*635a8641SAndroid Build Coastguard Worker                                            MOJO_CREATE_SHARED_BUFFER_FLAG_NONE};
13*635a8641SAndroid Build Coastguard Worker   SharedBufferHandle handle;
14*635a8641SAndroid Build Coastguard Worker   MojoCreateSharedBuffer(num_bytes, &options, handle.mutable_value());
15*635a8641SAndroid Build Coastguard Worker   return MakeScopedHandle(handle);
16*635a8641SAndroid Build Coastguard Worker }
17*635a8641SAndroid Build Coastguard Worker 
Clone(SharedBufferHandle::AccessMode access_mode) const18*635a8641SAndroid Build Coastguard Worker ScopedSharedBufferHandle SharedBufferHandle::Clone(
19*635a8641SAndroid Build Coastguard Worker     SharedBufferHandle::AccessMode access_mode) const {
20*635a8641SAndroid Build Coastguard Worker   ScopedSharedBufferHandle result;
21*635a8641SAndroid Build Coastguard Worker   if (!is_valid())
22*635a8641SAndroid Build Coastguard Worker     return result;
23*635a8641SAndroid Build Coastguard Worker 
24*635a8641SAndroid Build Coastguard Worker   MojoDuplicateBufferHandleOptions options = {
25*635a8641SAndroid Build Coastguard Worker       sizeof(options), MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_NONE};
26*635a8641SAndroid Build Coastguard Worker   if (access_mode == AccessMode::READ_ONLY)
27*635a8641SAndroid Build Coastguard Worker     options.flags |= MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_READ_ONLY;
28*635a8641SAndroid Build Coastguard Worker   SharedBufferHandle result_handle;
29*635a8641SAndroid Build Coastguard Worker   MojoDuplicateBufferHandle(value(), &options, result_handle.mutable_value());
30*635a8641SAndroid Build Coastguard Worker   result.reset(result_handle);
31*635a8641SAndroid Build Coastguard Worker   return result;
32*635a8641SAndroid Build Coastguard Worker }
33*635a8641SAndroid Build Coastguard Worker 
Map(uint64_t size) const34*635a8641SAndroid Build Coastguard Worker ScopedSharedBufferMapping SharedBufferHandle::Map(uint64_t size) const {
35*635a8641SAndroid Build Coastguard Worker   return MapAtOffset(size, 0);
36*635a8641SAndroid Build Coastguard Worker }
37*635a8641SAndroid Build Coastguard Worker 
MapAtOffset(uint64_t size,uint64_t offset) const38*635a8641SAndroid Build Coastguard Worker ScopedSharedBufferMapping SharedBufferHandle::MapAtOffset(
39*635a8641SAndroid Build Coastguard Worker     uint64_t size,
40*635a8641SAndroid Build Coastguard Worker     uint64_t offset) const {
41*635a8641SAndroid Build Coastguard Worker   void* buffer = nullptr;
42*635a8641SAndroid Build Coastguard Worker   MojoMapBuffer(value(), offset, size, nullptr, &buffer);
43*635a8641SAndroid Build Coastguard Worker   return ScopedSharedBufferMapping(buffer);
44*635a8641SAndroid Build Coastguard Worker }
45*635a8641SAndroid Build Coastguard Worker 
GetSize() const46*635a8641SAndroid Build Coastguard Worker uint64_t SharedBufferHandle::GetSize() const {
47*635a8641SAndroid Build Coastguard Worker   MojoSharedBufferInfo buffer_info;
48*635a8641SAndroid Build Coastguard Worker   buffer_info.struct_size = sizeof(buffer_info);
49*635a8641SAndroid Build Coastguard Worker   return MojoGetBufferInfo(value(), nullptr, &buffer_info) == MOJO_RESULT_OK
50*635a8641SAndroid Build Coastguard Worker              ? buffer_info.size
51*635a8641SAndroid Build Coastguard Worker              : 0;
52*635a8641SAndroid Build Coastguard Worker }
53*635a8641SAndroid Build Coastguard Worker 
54*635a8641SAndroid Build Coastguard Worker }  // namespace mojo
55