diff options
| author | Devin Moore <devinmoore@google.com> | 2020-09-22 17:20:54 +0000 |
|---|---|---|
| committer | Devin Moore <devinmoore@google.com> | 2020-09-22 17:31:51 +0000 |
| commit | 1b2d0a6a135f1d64b4ade148a2c98d4be7531538 (patch) | |
| tree | 87e883cb6c3be24c8abf0903f5c21f67aa4579aa /include | |
| parent | 4a2568d1d66f4fc3649ea7bc6581577851bed380 (diff) | |
| download | platform_system_libfmq-1b2d0a6a135f1d64b4ade148a2c98d4be7531538.tar.gz platform_system_libfmq-1b2d0a6a135f1d64b4ade148a2c98d4be7531538.tar.bz2 platform_system_libfmq-1b2d0a6a135f1d64b4ade148a2c98d4be7531538.zip | |
Reland "Add template arguments to MQDescriptor for AIDL"
1ed80beba04c46fdae931737696fb48ef9b6a319
Bug: 142326204
Change-Id: I696e9300f0fce8094e08a1e3544edb368a2453d9
Diffstat (limited to 'include')
| -rw-r--r-- | include/fmq/AidlMQDescriptorShim.h | 14 | ||||
| -rw-r--r-- | include/fmq/AidlMessageQueue.h | 55 |
2 files changed, 49 insertions, 20 deletions
diff --git a/include/fmq/AidlMQDescriptorShim.h b/include/fmq/AidlMQDescriptorShim.h index ea5fed9..eb4bbc2 100644 --- a/include/fmq/AidlMQDescriptorShim.h +++ b/include/fmq/AidlMQDescriptorShim.h @@ -18,18 +18,25 @@ #include <cutils/native_handle.h> #include <fmq/MQDescriptorBase.h> #include <limits> +#include <type_traits> namespace android { namespace details { using aidl::android::hardware::common::GrantorDescriptor; using aidl::android::hardware::common::MQDescriptor; +using aidl::android::hardware::common::SynchronizedReadWrite; +using aidl::android::hardware::common::UnsynchronizedWrite; using android::hardware::MQFlavor; template <typename T, MQFlavor flavor> struct AidlMQDescriptorShim { // Takes ownership of handle - AidlMQDescriptorShim(const MQDescriptor& desc); + AidlMQDescriptorShim( + const MQDescriptor< + T, typename std::conditional<flavor == hardware::kSynchronizedReadWrite, + SynchronizedReadWrite, UnsynchronizedWrite>::type>& + desc); // Takes ownership of handle AidlMQDescriptorShim(size_t bufferSize, native_handle_t* nHandle, size_t messageSize, @@ -71,7 +78,10 @@ struct AidlMQDescriptorShim { }; template <typename T, MQFlavor flavor> -AidlMQDescriptorShim<T, flavor>::AidlMQDescriptorShim(const MQDescriptor& desc) +AidlMQDescriptorShim<T, flavor>::AidlMQDescriptorShim( + const MQDescriptor<T, typename std::conditional<flavor == hardware::kSynchronizedReadWrite, + SynchronizedReadWrite, + UnsynchronizedWrite>::type>& desc) : mQuantum(desc.quantum), mFlags(desc.flags) { if (desc.quantum < 0 || desc.flags < 0) { // MQDescriptor uses signed integers, but the values must be positive. diff --git a/include/fmq/AidlMessageQueue.h b/include/fmq/AidlMessageQueue.h index fe4edc4..eaef087 100644 --- a/include/fmq/AidlMessageQueue.h +++ b/include/fmq/AidlMessageQueue.h @@ -17,22 +17,41 @@ #pragma once #include <aidl/android/hardware/common/MQDescriptor.h> +#include <aidl/android/hardware/common/SynchronizedReadWrite.h> +#include <aidl/android/hardware/common/UnsynchronizedWrite.h> #include <cutils/native_handle.h> #include <fmq/AidlMQDescriptorShim.h> #include <fmq/MessageQueueBase.h> #include <utils/Log.h> +#include <type_traits> namespace android { using aidl::android::hardware::common::MQDescriptor; +using aidl::android::hardware::common::SynchronizedReadWrite; +using aidl::android::hardware::common::UnsynchronizedWrite; using android::details::AidlMQDescriptorShim; using android::hardware::MQFlavor; +template <typename T> +struct FlavorTypeToValue; + +template <> +struct FlavorTypeToValue<SynchronizedReadWrite> { + static constexpr MQFlavor value = hardware::kSynchronizedReadWrite; +}; + +template <> +struct FlavorTypeToValue<UnsynchronizedWrite> { + static constexpr MQFlavor value = hardware::kUnsynchronizedWrite; +}; + typedef uint64_t RingBufferPosition; -template <typename T, MQFlavor flavor> -struct AidlMessageQueue final : public MessageQueueBase<AidlMQDescriptorShim, T, flavor> { - typedef AidlMQDescriptorShim<T, flavor> Descriptor; +template <typename T, typename U> +struct AidlMessageQueue final + : public MessageQueueBase<AidlMQDescriptorShim, T, FlavorTypeToValue<U>::value> { + typedef AidlMQDescriptorShim<T, FlavorTypeToValue<U>::value> Descriptor; /** * This constructor uses the external descriptor used with AIDL interfaces. * It will create an FMQ based on the descriptor that was obtained from @@ -43,7 +62,7 @@ struct AidlMessageQueue final : public MessageQueueBase<AidlMQDescriptorShim, T, * @param resetPointers Boolean indicating whether the read/write pointers * should be reset or not. */ - AidlMessageQueue(const MQDescriptor& desc, bool resetPointers = true); + AidlMessageQueue(const MQDescriptor<T, U>& desc, bool resetPointers = true); ~AidlMessageQueue() = default; /** @@ -55,7 +74,7 @@ struct AidlMessageQueue final : public MessageQueueBase<AidlMQDescriptorShim, T, * also be allocated and mapped for an EventFlag word. */ AidlMessageQueue(size_t numElementsInQueue, bool configureEventFlagWord = false); - MQDescriptor dupeDesc(); + MQDescriptor<T, U> dupeDesc(); private: AidlMessageQueue(const AidlMessageQueue& other) = delete; @@ -63,19 +82,19 @@ struct AidlMessageQueue final : public MessageQueueBase<AidlMQDescriptorShim, T, AidlMessageQueue() = delete; }; -template <typename T, MQFlavor flavor> -AidlMessageQueue<T, flavor>::AidlMessageQueue(const MQDescriptor& desc, bool resetPointers) - : MessageQueueBase<AidlMQDescriptorShim, T, flavor>(Descriptor(desc), resetPointers) {} +template <typename T, typename U> +AidlMessageQueue<T, U>::AidlMessageQueue(const MQDescriptor<T, U>& desc, bool resetPointers) + : MessageQueueBase<AidlMQDescriptorShim, T, FlavorTypeToValue<U>::value>(Descriptor(desc), + resetPointers) {} -template <typename T, MQFlavor flavor> -AidlMessageQueue<T, flavor>::AidlMessageQueue(size_t numElementsInQueue, - bool configureEventFlagWord) - : MessageQueueBase<AidlMQDescriptorShim, T, flavor>(numElementsInQueue, - configureEventFlagWord) {} +template <typename T, typename U> +AidlMessageQueue<T, U>::AidlMessageQueue(size_t numElementsInQueue, bool configureEventFlagWord) + : MessageQueueBase<AidlMQDescriptorShim, T, FlavorTypeToValue<U>::value>( + numElementsInQueue, configureEventFlagWord) {} -template <typename T, MQFlavor flavor> -MQDescriptor AidlMessageQueue<T, flavor>::dupeDesc() { - auto* shim = MessageQueueBase<AidlMQDescriptorShim, T, flavor>::getDesc(); +template <typename T, typename U> +MQDescriptor<T, U> AidlMessageQueue<T, U>::dupeDesc() { + auto* shim = MessageQueueBase<AidlMQDescriptorShim, T, FlavorTypeToValue<U>::value>::getDesc(); if (shim) { std::vector<aidl::android::hardware::common::GrantorDescriptor> grantors; for (const auto& grantor : shim->grantors()) { @@ -83,14 +102,14 @@ MQDescriptor AidlMessageQueue<T, flavor>::dupeDesc() { .offset = static_cast<int32_t>(grantor.offset), .extent = static_cast<int64_t>(grantor.extent)}); } - return MQDescriptor{ + return MQDescriptor<T, U>{ .quantum = static_cast<int32_t>(shim->getQuantum()), .grantors = grantors, .flags = static_cast<int32_t>(shim->getFlags()), .fileDescriptor = ndk::ScopedFileDescriptor(dup(shim->handle()->data[0])), }; } else { - return MQDescriptor(); + return MQDescriptor<T, U>(); } } |
