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 #pragma once 18*be431cd8SAndroid Build Coastguard Worker #include <android/hardware/common/fmq/MQDescriptor.h> 19*be431cd8SAndroid Build Coastguard Worker #include <android/hardware/common/fmq/SynchronizedReadWrite.h> 20*be431cd8SAndroid Build Coastguard Worker #include <android/hardware/common/fmq/UnsynchronizedWrite.h> 21*be431cd8SAndroid Build Coastguard Worker #include <fmq/MQDescriptorBase.h> 22*be431cd8SAndroid Build Coastguard Worker #include "AidlMQDescriptorShimCpp.h" 23*be431cd8SAndroid Build Coastguard Worker #include "AidlMessageQueueBase.h" 24*be431cd8SAndroid Build Coastguard Worker namespace android { 25*be431cd8SAndroid Build Coastguard Worker 26*be431cd8SAndroid Build Coastguard Worker template <> 27*be431cd8SAndroid Build Coastguard Worker struct FlavorTypeToValue<android::hardware::common::fmq::SynchronizedReadWrite> { 28*be431cd8SAndroid Build Coastguard Worker static constexpr MQFlavor value = hardware::kSynchronizedReadWrite; 29*be431cd8SAndroid Build Coastguard Worker }; 30*be431cd8SAndroid Build Coastguard Worker 31*be431cd8SAndroid Build Coastguard Worker template <> 32*be431cd8SAndroid Build Coastguard Worker struct FlavorTypeToValue<android::hardware::common::fmq::UnsynchronizedWrite> { 33*be431cd8SAndroid Build Coastguard Worker static constexpr MQFlavor value = hardware::kUnsynchronizedWrite; 34*be431cd8SAndroid Build Coastguard Worker }; 35*be431cd8SAndroid Build Coastguard Worker 36*be431cd8SAndroid Build Coastguard Worker struct BackendTypesStoreCpp { 37*be431cd8SAndroid Build Coastguard Worker template <typename T, MQFlavor flavor> 38*be431cd8SAndroid Build Coastguard Worker using AidlMQDescriptorShimType = android::details::AidlMQDescriptorShimCpp<T, flavor>; 39*be431cd8SAndroid Build Coastguard Worker using GrantorDescriptorType = android::hardware::common::fmq::GrantorDescriptor; 40*be431cd8SAndroid Build Coastguard Worker template <typename T, typename flavor> 41*be431cd8SAndroid Build Coastguard Worker using MQDescriptorType = android::hardware::common::fmq::MQDescriptor<T, flavor>; 42*be431cd8SAndroid Build Coastguard Worker using FileDescriptorType = os::ParcelFileDescriptor; 43*be431cd8SAndroid Build Coastguard Worker static FileDescriptorType createFromInt(int fd) { 44*be431cd8SAndroid Build Coastguard Worker return FileDescriptorType(binder::unique_fd(fd)); 45*be431cd8SAndroid Build Coastguard Worker } 46*be431cd8SAndroid Build Coastguard Worker }; 47*be431cd8SAndroid Build Coastguard Worker 48*be431cd8SAndroid Build Coastguard Worker template <typename T, typename U> 49*be431cd8SAndroid Build Coastguard Worker struct AidlMessageQueueCpp final : public AidlMessageQueueBase<T, U, BackendTypesStoreCpp> { 50*be431cd8SAndroid Build Coastguard Worker AidlMessageQueueCpp(const android::hardware::common::fmq::MQDescriptor<T, U>& desc, 51*be431cd8SAndroid Build Coastguard Worker bool resetPointers = true); 52*be431cd8SAndroid Build Coastguard Worker ~AidlMessageQueueCpp() = default; 53*be431cd8SAndroid Build Coastguard Worker 54*be431cd8SAndroid Build Coastguard Worker /** 55*be431cd8SAndroid Build Coastguard Worker * This constructor uses Ashmem shared memory to create an FMQ 56*be431cd8SAndroid Build Coastguard Worker * that can contain a maximum of 'numElementsInQueue' elements of type T. 57*be431cd8SAndroid Build Coastguard Worker * 58*be431cd8SAndroid Build Coastguard Worker * @param numElementsInQueue Capacity of the AidlMessageQueueCpp in terms of T. 59*be431cd8SAndroid Build Coastguard Worker * @param configureEventFlagWord Boolean that specifies if memory should 60*be431cd8SAndroid Build Coastguard Worker * also be allocated and mapped for an EventFlag word. 61*be431cd8SAndroid Build Coastguard Worker * @param bufferFd User-supplied file descriptor to map the memory for the ringbuffer 62*be431cd8SAndroid Build Coastguard Worker * By default, bufferFd=-1 means library will allocate ashmem region for ringbuffer. 63*be431cd8SAndroid Build Coastguard Worker * MessageQueue takes ownership of the file descriptor. 64*be431cd8SAndroid Build Coastguard Worker * @param bufferSize size of buffer in bytes that bufferFd represents. This 65*be431cd8SAndroid Build Coastguard Worker * size must be larger than or equal to (numElementsInQueue * sizeof(T)). 66*be431cd8SAndroid Build Coastguard Worker * Otherwise, operations will cause out-of-bounds memory access. 67*be431cd8SAndroid Build Coastguard Worker */ 68*be431cd8SAndroid Build Coastguard Worker AidlMessageQueueCpp(size_t numElementsInQueue, bool configureEventFlagWord, 69*be431cd8SAndroid Build Coastguard Worker android::base::unique_fd bufferFd, size_t bufferSize); 70*be431cd8SAndroid Build Coastguard Worker 71*be431cd8SAndroid Build Coastguard Worker AidlMessageQueueCpp(size_t numElementsInQueue, bool configureEventFlagWord = false) 72*be431cd8SAndroid Build Coastguard Worker : AidlMessageQueueCpp(numElementsInQueue, configureEventFlagWord, 73*be431cd8SAndroid Build Coastguard Worker android::base::unique_fd(), 0) {} 74*be431cd8SAndroid Build Coastguard Worker 75*be431cd8SAndroid Build Coastguard Worker template <typename V = T> 76*be431cd8SAndroid Build Coastguard Worker AidlMessageQueueCpp(size_t numElementsInQueue, bool configureEventFlagWord = false, 77*be431cd8SAndroid Build Coastguard Worker std::enable_if_t<std::is_same_v<V, MQErased>, size_t> quantum = sizeof(T)) 78*be431cd8SAndroid Build Coastguard Worker : AidlMessageQueueCpp(numElementsInQueue, configureEventFlagWord, 79*be431cd8SAndroid Build Coastguard Worker android::base::unique_fd(), 0, quantum) {} 80*be431cd8SAndroid Build Coastguard Worker 81*be431cd8SAndroid Build Coastguard Worker template <typename V = T> 82*be431cd8SAndroid Build Coastguard Worker AidlMessageQueueCpp(size_t numElementsInQueue, bool configureEventFlagWord, 83*be431cd8SAndroid Build Coastguard Worker android::base::unique_fd bufferFd, size_t bufferSize, 84*be431cd8SAndroid Build Coastguard Worker std::enable_if_t<std::is_same_v<V, MQErased>, size_t> quantum); 85*be431cd8SAndroid Build Coastguard Worker }; 86*be431cd8SAndroid Build Coastguard Worker 87*be431cd8SAndroid Build Coastguard Worker template <typename T, typename U> 88*be431cd8SAndroid Build Coastguard Worker AidlMessageQueueCpp<T, U>::AidlMessageQueueCpp( 89*be431cd8SAndroid Build Coastguard Worker const android::hardware::common::fmq::MQDescriptor<T, U>& desc, bool resetPointers) 90*be431cd8SAndroid Build Coastguard Worker : AidlMessageQueueBase<T, U, BackendTypesStoreCpp>(desc, resetPointers) {} 91*be431cd8SAndroid Build Coastguard Worker 92*be431cd8SAndroid Build Coastguard Worker template <typename T, typename U> 93*be431cd8SAndroid Build Coastguard Worker AidlMessageQueueCpp<T, U>::AidlMessageQueueCpp(size_t numElementsInQueue, 94*be431cd8SAndroid Build Coastguard Worker bool configureEventFlagWord, 95*be431cd8SAndroid Build Coastguard Worker android::base::unique_fd bufferFd, size_t bufferSize) 96*be431cd8SAndroid Build Coastguard Worker : AidlMessageQueueBase<T, U, BackendTypesStoreCpp>(numElementsInQueue, configureEventFlagWord, 97*be431cd8SAndroid Build Coastguard Worker std::move(bufferFd), bufferSize) {} 98*be431cd8SAndroid Build Coastguard Worker 99*be431cd8SAndroid Build Coastguard Worker template <typename T, typename U> 100*be431cd8SAndroid Build Coastguard Worker template <typename V> 101*be431cd8SAndroid Build Coastguard Worker AidlMessageQueueCpp<T, U>::AidlMessageQueueCpp( 102*be431cd8SAndroid Build Coastguard Worker size_t numElementsInQueue, bool configureEventFlagWord, android::base::unique_fd bufferFd, 103*be431cd8SAndroid Build Coastguard Worker size_t bufferSize, std::enable_if_t<std::is_same_v<V, MQErased>, size_t> quantum) 104*be431cd8SAndroid Build Coastguard Worker : AidlMessageQueueBase<T, U, BackendTypesStoreCpp>(numElementsInQueue, configureEventFlagWord, 105*be431cd8SAndroid Build Coastguard Worker std::move(bufferFd), bufferSize, quantum) {} 106*be431cd8SAndroid Build Coastguard Worker 107*be431cd8SAndroid Build Coastguard Worker } // namespace android