1*be431cd8SAndroid Build Coastguard Worker /* 2*be431cd8SAndroid Build Coastguard Worker * Copyright (C) 2020 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 19*be431cd8SAndroid Build Coastguard Worker #include <hidl/MQDescriptor.h> 20*be431cd8SAndroid Build Coastguard Worker #include "MessageQueueBase.h" 21*be431cd8SAndroid Build Coastguard Worker 22*be431cd8SAndroid Build Coastguard Worker namespace android { 23*be431cd8SAndroid Build Coastguard Worker namespace hardware { 24*be431cd8SAndroid Build Coastguard Worker 25*be431cd8SAndroid Build Coastguard Worker template <typename T, MQFlavor flavor> 26*be431cd8SAndroid Build Coastguard Worker struct MessageQueue final : public MessageQueueBase<MQDescriptor, T, flavor> { 27*be431cd8SAndroid Build Coastguard Worker typedef MQDescriptor<T, flavor> Descriptor; 28*be431cd8SAndroid Build Coastguard Worker MessageQueue(const Descriptor& Desc, bool resetPointers = true) 29*be431cd8SAndroid Build Coastguard Worker : MessageQueueBase<MQDescriptor, T, flavor>(Desc, resetPointers) {} 30*be431cd8SAndroid Build Coastguard Worker ~MessageQueue() = default; 31*be431cd8SAndroid Build Coastguard Worker 32*be431cd8SAndroid Build Coastguard Worker /** 33*be431cd8SAndroid Build Coastguard Worker * This constructor uses Ashmem shared memory to create an FMQ 34*be431cd8SAndroid Build Coastguard Worker * that can contain a maximum of 'numElementsInQueue' elements of type T. 35*be431cd8SAndroid Build Coastguard Worker * 36*be431cd8SAndroid Build Coastguard Worker * @param numElementsInQueue Capacity of the MessageQueue in terms of T. 37*be431cd8SAndroid Build Coastguard Worker * @param configureEventFlagWord Boolean that specifies if memory should 38*be431cd8SAndroid Build Coastguard Worker * also be allocated and mapped for an EventFlag word. 39*be431cd8SAndroid Build Coastguard Worker * @param bufferFd User-supplied file descriptor to map the memory for the ringbuffer 40*be431cd8SAndroid Build Coastguard Worker * By default, bufferFd=-1 means library will allocate ashmem region for ringbuffer. 41*be431cd8SAndroid Build Coastguard Worker * MessageQueue takes ownership of the file descriptor. 42*be431cd8SAndroid Build Coastguard Worker * @param bufferSize size of buffer in bytes that bufferFd represents. This 43*be431cd8SAndroid Build Coastguard Worker * size must be larger than or equal to (numElementsInQueue * sizeof(T)). 44*be431cd8SAndroid Build Coastguard Worker * Otherwise, operations will cause out-of-bounds memory access. 45*be431cd8SAndroid Build Coastguard Worker */ MessageQueuefinal46*be431cd8SAndroid Build Coastguard Worker MessageQueue(size_t numElementsInQueue, bool configureEventFlagWord, 47*be431cd8SAndroid Build Coastguard Worker android::base::unique_fd bufferFd, size_t bufferSize) 48*be431cd8SAndroid Build Coastguard Worker : MessageQueueBase<MQDescriptor, T, flavor>(numElementsInQueue, configureEventFlagWord, 49*be431cd8SAndroid Build Coastguard Worker std::move(bufferFd), bufferSize) {} 50*be431cd8SAndroid Build Coastguard Worker 51*be431cd8SAndroid Build Coastguard Worker MessageQueue(size_t numElementsInQueue, bool configureEventFlagWord = false) 52*be431cd8SAndroid Build Coastguard Worker : MessageQueueBase<MQDescriptor, T, flavor>(numElementsInQueue, configureEventFlagWord, 53*be431cd8SAndroid Build Coastguard Worker android::base::unique_fd(), 0) {} 54*be431cd8SAndroid Build Coastguard Worker 55*be431cd8SAndroid Build Coastguard Worker private: 56*be431cd8SAndroid Build Coastguard Worker MessageQueue(const MessageQueue& other) = delete; 57*be431cd8SAndroid Build Coastguard Worker MessageQueue& operator=(const MessageQueue& other) = delete; 58*be431cd8SAndroid Build Coastguard Worker MessageQueue() = delete; 59*be431cd8SAndroid Build Coastguard Worker }; 60*be431cd8SAndroid Build Coastguard Worker 61*be431cd8SAndroid Build Coastguard Worker } // namespace hardware 62*be431cd8SAndroid Build Coastguard Worker } // namespace android 63