xref: /aosp_15_r20/system/libfmq/ErasedMessageQueue.cpp (revision be431cd81a9a2349eaea34eb56fcf6d1608da596)
1*be431cd8SAndroid Build Coastguard Worker /*
2*be431cd8SAndroid Build Coastguard Worker  * Copyright (C) 2024 The Android Open Source Project
3*be431cd8SAndroid Build Coastguard Worker  *
4*be431cd8SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*be431cd8SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*be431cd8SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*be431cd8SAndroid Build Coastguard Worker  *
8*be431cd8SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*be431cd8SAndroid Build Coastguard Worker  *
10*be431cd8SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*be431cd8SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*be431cd8SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*be431cd8SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*be431cd8SAndroid Build Coastguard Worker  * limitations under the License.
15*be431cd8SAndroid Build Coastguard Worker  */
16*be431cd8SAndroid Build Coastguard Worker 
17*be431cd8SAndroid Build Coastguard Worker #include "ErasedMessageQueue.hpp"
18*be431cd8SAndroid Build Coastguard Worker 
19*be431cd8SAndroid Build Coastguard Worker /*
20*be431cd8SAndroid Build Coastguard Worker  * Convert a Rust NativeHandle (passed as its individual fields) to a C++ one.
21*be431cd8SAndroid Build Coastguard Worker  * Duplicates the file descriptors, which are passed as integers.
22*be431cd8SAndroid Build Coastguard Worker  */
convertHandle(const int * fds,size_t n_fds,const int32_t * ints,size_t n_ints)23*be431cd8SAndroid Build Coastguard Worker NativeHandle convertHandle(const int* fds, size_t n_fds, const int32_t* ints, size_t n_ints) {
24*be431cd8SAndroid Build Coastguard Worker     std::vector<ndk::ScopedFileDescriptor> fdv;
25*be431cd8SAndroid Build Coastguard Worker     for (size_t i = 0; i < n_fds; i++) {
26*be431cd8SAndroid Build Coastguard Worker         fdv.push_back(ndk::ScopedFileDescriptor(dup(fds[i])));
27*be431cd8SAndroid Build Coastguard Worker     }
28*be431cd8SAndroid Build Coastguard Worker     std::vector<int32_t> intv(ints, ints + n_ints);
29*be431cd8SAndroid Build Coastguard Worker 
30*be431cd8SAndroid Build Coastguard Worker     return NativeHandle(std::move(fdv), intv);
31*be431cd8SAndroid Build Coastguard Worker }
32*be431cd8SAndroid Build Coastguard Worker 
convertGrantor(int32_t fdIndex,int32_t offset,int64_t extent)33*be431cd8SAndroid Build Coastguard Worker GrantorDescriptor convertGrantor(int32_t fdIndex, int32_t offset, int64_t extent) {
34*be431cd8SAndroid Build Coastguard Worker     return GrantorDescriptor(fdIndex, offset, extent);
35*be431cd8SAndroid Build Coastguard Worker }
36*be431cd8SAndroid Build Coastguard Worker 
convertDesc(const GrantorDescriptor * grantors,size_t n_grantors,const int * handle_fds,size_t handle_n_fds,const int32_t * handle_ints,size_t handle_n_ints,int32_t quantum,int32_t flags)37*be431cd8SAndroid Build Coastguard Worker ErasedMessageQueueDesc* convertDesc(const GrantorDescriptor* grantors, size_t n_grantors,
38*be431cd8SAndroid Build Coastguard Worker                                     const int* handle_fds, size_t handle_n_fds,
39*be431cd8SAndroid Build Coastguard Worker                                     const int32_t* handle_ints, size_t handle_n_ints,
40*be431cd8SAndroid Build Coastguard Worker                                     int32_t quantum, int32_t flags) {
41*be431cd8SAndroid Build Coastguard Worker     std::vector<GrantorDescriptor> grantorsv(grantors, grantors + n_grantors);
42*be431cd8SAndroid Build Coastguard Worker     auto&& handle = convertHandle(handle_fds, handle_n_fds, handle_ints, handle_n_ints);
43*be431cd8SAndroid Build Coastguard Worker 
44*be431cd8SAndroid Build Coastguard Worker     return new ErasedMessageQueueDesc{
45*be431cd8SAndroid Build Coastguard Worker             grantorsv,
46*be431cd8SAndroid Build Coastguard Worker             std::move(handle),
47*be431cd8SAndroid Build Coastguard Worker             quantum,
48*be431cd8SAndroid Build Coastguard Worker             flags,
49*be431cd8SAndroid Build Coastguard Worker     };
50*be431cd8SAndroid Build Coastguard Worker }
51*be431cd8SAndroid Build Coastguard Worker 
freeDesc(ErasedMessageQueueDesc * desc)52*be431cd8SAndroid Build Coastguard Worker void freeDesc(ErasedMessageQueueDesc* desc) {
53*be431cd8SAndroid Build Coastguard Worker     delete desc;
54*be431cd8SAndroid Build Coastguard Worker }
55*be431cd8SAndroid Build Coastguard Worker 
descGrantors(const ErasedMessageQueueDesc & desc)56*be431cd8SAndroid Build Coastguard Worker const GrantorDescriptor* descGrantors(const ErasedMessageQueueDesc& desc) {
57*be431cd8SAndroid Build Coastguard Worker     return desc.grantors.data();
58*be431cd8SAndroid Build Coastguard Worker }
descNumGrantors(const ErasedMessageQueueDesc & desc)59*be431cd8SAndroid Build Coastguard Worker size_t descNumGrantors(const ErasedMessageQueueDesc& desc) {
60*be431cd8SAndroid Build Coastguard Worker     return desc.grantors.size();
61*be431cd8SAndroid Build Coastguard Worker }
descHandleFDs(const ErasedMessageQueueDesc & desc)62*be431cd8SAndroid Build Coastguard Worker const ndk::ScopedFileDescriptor* descHandleFDs(const ErasedMessageQueueDesc& desc) {
63*be431cd8SAndroid Build Coastguard Worker     return desc.handle.fds.data();
64*be431cd8SAndroid Build Coastguard Worker }
descHandleNumFDs(const ErasedMessageQueueDesc & desc)65*be431cd8SAndroid Build Coastguard Worker size_t descHandleNumFDs(const ErasedMessageQueueDesc& desc) {
66*be431cd8SAndroid Build Coastguard Worker     return desc.handle.fds.size();
67*be431cd8SAndroid Build Coastguard Worker }
descHandleInts(const ErasedMessageQueueDesc & desc)68*be431cd8SAndroid Build Coastguard Worker const int* descHandleInts(const ErasedMessageQueueDesc& desc) {
69*be431cd8SAndroid Build Coastguard Worker     return desc.handle.ints.data();
70*be431cd8SAndroid Build Coastguard Worker }
descHandleNumInts(const ErasedMessageQueueDesc & desc)71*be431cd8SAndroid Build Coastguard Worker size_t descHandleNumInts(const ErasedMessageQueueDesc& desc) {
72*be431cd8SAndroid Build Coastguard Worker     return desc.handle.ints.size();
73*be431cd8SAndroid Build Coastguard Worker }
descQuantum(const ErasedMessageQueueDesc & desc)74*be431cd8SAndroid Build Coastguard Worker int32_t descQuantum(const ErasedMessageQueueDesc& desc) {
75*be431cd8SAndroid Build Coastguard Worker     return desc.quantum;
76*be431cd8SAndroid Build Coastguard Worker }
descFlags(const ErasedMessageQueueDesc & desc)77*be431cd8SAndroid Build Coastguard Worker int32_t descFlags(const ErasedMessageQueueDesc& desc) {
78*be431cd8SAndroid Build Coastguard Worker     return desc.flags;
79*be431cd8SAndroid Build Coastguard Worker }
80*be431cd8SAndroid Build Coastguard Worker 
ErasedMessageQueue(const ErasedMessageQueueDesc & desc,bool resetPointers)81*be431cd8SAndroid Build Coastguard Worker ErasedMessageQueue::ErasedMessageQueue(const ErasedMessageQueueDesc& desc, bool resetPointers)
82*be431cd8SAndroid Build Coastguard Worker     : inner(new android::AidlMessageQueue<MQErased, SynchronizedReadWrite>(desc, resetPointers)) {}
83*be431cd8SAndroid Build Coastguard Worker 
ErasedMessageQueue(size_t numElementsInQueue,bool configureEventFlagWord,size_t quantum)84*be431cd8SAndroid Build Coastguard Worker ErasedMessageQueue::ErasedMessageQueue(size_t numElementsInQueue, bool configureEventFlagWord,
85*be431cd8SAndroid Build Coastguard Worker                                        size_t quantum)
86*be431cd8SAndroid Build Coastguard Worker     : inner(new android::AidlMessageQueue<MQErased, SynchronizedReadWrite>(
87*be431cd8SAndroid Build Coastguard Worker               numElementsInQueue, configureEventFlagWord, quantum)) {}
88*be431cd8SAndroid Build Coastguard Worker 
beginWrite(size_t nMessages,MemTransaction * memTx) const89*be431cd8SAndroid Build Coastguard Worker bool ErasedMessageQueue::beginWrite(size_t nMessages, MemTransaction* memTx) const {
90*be431cd8SAndroid Build Coastguard Worker     AidlMessageQueue<MQErased, SynchronizedReadWrite>::MemTransaction memTxInternal;
91*be431cd8SAndroid Build Coastguard Worker     auto result = inner->beginWrite(nMessages, &memTxInternal);
92*be431cd8SAndroid Build Coastguard Worker     memTx->first = memTxInternal.getFirstRegion();
93*be431cd8SAndroid Build Coastguard Worker     memTx->second = memTxInternal.getSecondRegion();
94*be431cd8SAndroid Build Coastguard Worker     return result;
95*be431cd8SAndroid Build Coastguard Worker };
96*be431cd8SAndroid Build Coastguard Worker 
commitWrite(size_t nMessages)97*be431cd8SAndroid Build Coastguard Worker bool ErasedMessageQueue::commitWrite(size_t nMessages) {
98*be431cd8SAndroid Build Coastguard Worker     return inner->commitWrite(nMessages);
99*be431cd8SAndroid Build Coastguard Worker }
100*be431cd8SAndroid Build Coastguard Worker 
beginRead(size_t nMessages,MemTransaction * memTx) const101*be431cd8SAndroid Build Coastguard Worker bool ErasedMessageQueue::beginRead(size_t nMessages, MemTransaction* memTx) const {
102*be431cd8SAndroid Build Coastguard Worker     AidlMessageQueue<MQErased, SynchronizedReadWrite>::MemTransaction memTxInternal;
103*be431cd8SAndroid Build Coastguard Worker     auto result = inner->beginRead(nMessages, &memTxInternal);
104*be431cd8SAndroid Build Coastguard Worker     memTx->first = memTxInternal.getFirstRegion();
105*be431cd8SAndroid Build Coastguard Worker     memTx->second = memTxInternal.getSecondRegion();
106*be431cd8SAndroid Build Coastguard Worker     return result;
107*be431cd8SAndroid Build Coastguard Worker }
108*be431cd8SAndroid Build Coastguard Worker 
commitRead(size_t nMessages)109*be431cd8SAndroid Build Coastguard Worker bool ErasedMessageQueue::commitRead(size_t nMessages) {
110*be431cd8SAndroid Build Coastguard Worker     return inner->commitRead(nMessages);
111*be431cd8SAndroid Build Coastguard Worker }
112*be431cd8SAndroid Build Coastguard Worker 
dupeDesc() const113*be431cd8SAndroid Build Coastguard Worker ErasedMessageQueueDesc* ErasedMessageQueue::dupeDesc() const {
114*be431cd8SAndroid Build Coastguard Worker     return new ErasedMessageQueueDesc(inner->dupeDesc());
115*be431cd8SAndroid Build Coastguard Worker }
116