xref: /aosp_15_r20/system/libfmq/include/fmq/MessageQueue.h (revision be431cd81a9a2349eaea34eb56fcf6d1608da596)
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