| diff --git a/platform2/aosp/system/libfmq/include/fmq/MessageQueueBase.h b/platform2/aosp/system/libfmq/include/fmq/MessageQueueBase.h |
| index 0cb83a6..0df8104 100644 |
| --- a/platform2/aosp/system/libfmq/include/fmq/MessageQueueBase.h |
| +++ b/platform2/aosp/system/libfmq/include/fmq/MessageQueueBase.h |
| @@ -19,6 +19,7 @@ |
| #include <cutils/ashmem.h> |
| #include <fmq/EventFlag.h> |
| #include <sys/mman.h> |
| +#include <unistd.h> |
| #include <utils/Log.h> |
| #include <utils/SystemClock.h> |
| #include <atomic> |
| @@ -231,6 +232,10 @@ struct MessageQueueBase { |
| struct MemRegion { |
| MemRegion() : MemRegion(nullptr, 0) {} |
| |
| + MemRegion(const MemRegion& other) { |
| + *this = other; |
| + } |
| + |
| MemRegion(T* base, size_t size) : address(base), length(size) {} |
| |
| MemRegion& operator=(const MemRegion& other) { |
| @@ -576,7 +581,9 @@ void MessageQueueBase<MQDescriptorType, T, flavor>::initMemory(bool resetPointer |
| const auto& grantors = mDesc->grantors(); |
| for (const auto& grantor : grantors) { |
| if (hardware::details::isAlignedToWordBoundary(grantor.offset) == false) { |
| +#ifdef __BIONIC__ |
| __assert(__FILE__, __LINE__, "Grantor offsets need to be aligned"); |
| +#endif |
| } |
| } |
| |
| @@ -661,9 +668,10 @@ MessageQueueBase<MQDescriptorType, T, flavor>::MessageQueueBase(size_t numElemen |
| * kQueueSizeBytes needs to be aligned to word boundary so that all offsets |
| * in the grantorDescriptor will be word aligned. |
| */ |
| + size_t page_size = static_cast<size_t>(sysconf(_SC_PAGE_SIZE)); |
| size_t kAshmemSizePageAligned = (hardware::details::alignToWordBoundary(kQueueSizeBytes) + |
| - kMetaDataSize + PAGE_SIZE - 1) & |
| - ~(PAGE_SIZE - 1); |
| + kMetaDataSize + page_size - 1) & |
| + ~(page_size - 1); |
| |
| /* |
| * Create an ashmem region to map the memory for the ringbuffer, |
| @@ -1172,7 +1180,8 @@ void* MessageQueueBase<MQDescriptorType, T, flavor>::mapGrantorDescr(uint32_t gr |
| /* |
| * Offset for mmap must be a multiple of PAGE_SIZE. |
| */ |
| - int mapOffset = (grantors[grantorIdx].offset / PAGE_SIZE) * PAGE_SIZE; |
| + size_t page_size = static_cast<size_t>(sysconf(_SC_PAGE_SIZE)); |
| + int mapOffset = (grantors[grantorIdx].offset / page_size) * page_size; |
| int mapLength = grantors[grantorIdx].offset - mapOffset + grantors[grantorIdx].extent; |
| |
| void* address = mmap(0, mapLength, PROT_READ | PROT_WRITE, MAP_SHARED, handle->data[fdIndex], |
| @@ -1192,7 +1201,8 @@ void MessageQueueBase<MQDescriptorType, T, flavor>::unmapGrantorDescr(void* addr |
| return; |
| } |
| |
| - int mapOffset = (grantors[grantorIdx].offset / PAGE_SIZE) * PAGE_SIZE; |
| + size_t page_size = static_cast<size_t>(sysconf(_SC_PAGE_SIZE)); |
| + int mapOffset = (grantors[grantorIdx].offset / page_size) * page_size; |
| int mapLength = grantors[grantorIdx].offset - mapOffset + grantors[grantorIdx].extent; |
| void* baseAddress = |
| reinterpret_cast<uint8_t*>(address) - (grantors[grantorIdx].offset - mapOffset); |