diff options
author | 2018-12-13 18:23:07 -0800 | |
---|---|---|
committer | 2018-12-15 05:04:38 +0000 | |
commit | a99f9114d15add6bf1d67264e2a60a73e13009fe (patch) | |
tree | 706d3852bee81e83008adc789f0582f2be576384 | |
parent | 7bd483a2ee8e6c2db596d95a690e452e1a7b43f3 (diff) |
Change atomics in ashmem from uint64_t to uint32_t
Fix: 117849512
Test: Blueline: atest AHardwareBufferTest BufferHub_test
buffer_hub_queue_producer-test libgui_test
libsensor_test vrflinger_test buffer_hub-test buffer_hub_queue-test
dvr_buffer_queue-test dvr_api-test dvr_display-test
Test: in libui_test InputSurfacesTest are segfault on top of master already.
Test: Vega: AHardwareBufferTest BufferHubBuffer_test
BufferHubMetadata_test buffer_hub_queue_producer-test buffer_hub-test
dvr_buffer_queue-test buffer_hub_queue-test dvr_api-test
libdvrtracking-test
Change-Id: I55f91c21f7ac07615b5451b5413521d7938cf591
24 files changed, 239 insertions, 236 deletions
diff --git a/libs/gui/BufferHubProducer.cpp b/libs/gui/BufferHubProducer.cpp index ed773e003f..16952a6625 100644 --- a/libs/gui/BufferHubProducer.cpp +++ b/libs/gui/BufferHubProducer.cpp @@ -520,7 +520,7 @@ status_t BufferHubProducer::cancelBuffer(int slot, const sp<Fence>& fence) { } auto buffer_producer = buffers_[slot].mBufferProducer; - queue_->Enqueue(buffer_producer, size_t(slot), 0ULL); + queue_->Enqueue(buffer_producer, size_t(slot), 0U); buffers_[slot].mBufferState.cancel(); buffers_[slot].mFence = fence; ALOGV("cancelBuffer: slot %d", slot); diff --git a/libs/ui/BufferHubBuffer.cpp b/libs/ui/BufferHubBuffer.cpp index 1464e48367..5bc113f4b2 100644 --- a/libs/ui/BufferHubBuffer.cpp +++ b/libs/ui/BufferHubBuffer.cpp @@ -191,22 +191,22 @@ int BufferHubBuffer::ImportGraphicBuffer() { mClientStateMask = bufferTraits.client_state_mask(); // TODO(b/112012161) Set up shared fences. - ALOGD("BufferHubBuffer::ImportGraphicBuffer: id=%d, buffer_state=%" PRIx64 ".", id(), + ALOGD("BufferHubBuffer::ImportGraphicBuffer: id=%d, buffer_state=%" PRIx32 ".", id(), buffer_state_->load(std::memory_order_acquire)); return 0; } int BufferHubBuffer::Gain() { - uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); + uint32_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (IsClientGained(current_buffer_state, mClientStateMask)) { - ALOGV("%s: Buffer is already gained by this client %" PRIx64 ".", __FUNCTION__, + ALOGV("%s: Buffer is already gained by this client %" PRIx32 ".", __FUNCTION__, mClientStateMask); return 0; } do { if (AnyClientGained(current_buffer_state & (~mClientStateMask)) || AnyClientAcquired(current_buffer_state)) { - ALOGE("%s: Buffer is in use, id=%d mClientStateMask=%" PRIx64 " state=%" PRIx64 ".", + ALOGE("%s: Buffer is in use, id=%d mClientStateMask=%" PRIx32 " state=%" PRIx32 ".", __FUNCTION__, mId, mClientStateMask, current_buffer_state); return -EBUSY; } @@ -220,13 +220,13 @@ int BufferHubBuffer::Gain() { } int BufferHubBuffer::Post() { - uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); - uint64_t current_active_clients_bit_mask = 0ULL; - uint64_t updated_buffer_state = 0ULL; + uint32_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); + uint32_t current_active_clients_bit_mask = 0U; + uint32_t updated_buffer_state = 0U; do { if (!IsClientGained(current_buffer_state, mClientStateMask)) { ALOGE("%s: Cannot post a buffer that is not gained by this client. buffer_id=%d " - "mClientStateMask=%" PRIx64 " state=%" PRIx64 ".", + "mClientStateMask=%" PRIx32 " state=%" PRIx32 ".", __FUNCTION__, mId, mClientStateMask, current_buffer_state); return -EBUSY; } @@ -242,17 +242,17 @@ int BufferHubBuffer::Post() { } int BufferHubBuffer::Acquire() { - uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); + uint32_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (IsClientAcquired(current_buffer_state, mClientStateMask)) { - ALOGV("%s: Buffer is already acquired by this client %" PRIx64 ".", __FUNCTION__, + ALOGV("%s: Buffer is already acquired by this client %" PRIx32 ".", __FUNCTION__, mClientStateMask); return 0; } - uint64_t updated_buffer_state = 0ULL; + uint32_t updated_buffer_state = 0U; do { if (!IsClientPosted(current_buffer_state, mClientStateMask)) { ALOGE("%s: Cannot acquire a buffer that is not in posted state. buffer_id=%d " - "mClientStateMask=%" PRIx64 " state=%" PRIx64 ".", + "mClientStateMask=%" PRIx32 " state=%" PRIx32 ".", __FUNCTION__, mId, mClientStateMask, current_buffer_state); return -EBUSY; } @@ -266,13 +266,13 @@ int BufferHubBuffer::Acquire() { } int BufferHubBuffer::Release() { - uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); + uint32_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (IsClientReleased(current_buffer_state, mClientStateMask)) { - ALOGV("%s: Buffer is already released by this client %" PRIx64 ".", __FUNCTION__, + ALOGV("%s: Buffer is already released by this client %" PRIx32 ".", __FUNCTION__, mClientStateMask); return 0; } - uint64_t updated_buffer_state = 0ULL; + uint32_t updated_buffer_state = 0U; do { updated_buffer_state = current_buffer_state & (~mClientStateMask); } while (!buffer_state_->compare_exchange_weak(current_buffer_state, updated_buffer_state, diff --git a/libs/ui/include/ui/BufferHubBuffer.h b/libs/ui/include/ui/BufferHubBuffer.h index 11e9b5c88d..90dd391d8d 100644 --- a/libs/ui/include/ui/BufferHubBuffer.h +++ b/libs/ui/include/ui/BufferHubBuffer.h @@ -86,13 +86,13 @@ public: const native_handle_t* DuplicateHandle() { return mBufferHandle.DuplicateHandle(); } // Returns the current value of MetadataHeader::buffer_state. - uint64_t buffer_state() { + uint32_t buffer_state() { return mMetadata.metadata_header()->buffer_state.load(std::memory_order_acquire); } // A state mask which is unique to a buffer hub client among all its siblings sharing the same // concrete graphic buffer. - uint64_t client_state_mask() const { return mClientStateMask; } + uint32_t client_state_mask() const { return mClientStateMask; } size_t user_metadata_size() const { return mMetadata.user_metadata_size(); } @@ -154,7 +154,7 @@ private: // Client state mask of this BufferHubBuffer object. It is unique amoung all // clients/users of the buffer. - uint64_t mClientStateMask = 0; + uint32_t mClientStateMask = 0U; // Stores ground truth of the buffer. AHardwareBuffer_Desc mBufferDesc; @@ -166,9 +166,9 @@ private: // bufferhubd daemon and all buffer clients. BufferHubMetadata mMetadata; // Shortcuts to the atomics inside the header of mMetadata. - std::atomic<uint64_t>* buffer_state_{nullptr}; - std::atomic<uint64_t>* fence_state_{nullptr}; - std::atomic<uint64_t>* active_clients_bit_mask_{nullptr}; + std::atomic<uint32_t>* buffer_state_ = nullptr; + std::atomic<uint32_t>* fence_state_ = nullptr; + std::atomic<uint32_t>* active_clients_bit_mask_ = nullptr; // PDX backend. BufferHubClient mClient; diff --git a/libs/ui/include/ui/BufferHubDefs.h b/libs/ui/include/ui/BufferHubDefs.h index ef6668bd76..d259fefb8f 100644 --- a/libs/ui/include/ui/BufferHubDefs.h +++ b/libs/ui/include/ui/BufferHubDefs.h @@ -29,10 +29,10 @@ namespace android { namespace BufferHubDefs { -// Single buffer clients (up to 32) ownership signal. -// 64-bit atomic unsigned int. -// Each client takes 2 bits. The first bit locates in the first 32 bits of -// buffer_state; the second bit locates in the last 32 bits of buffer_state. +// Single buffer clients (up to 16) ownership signal. +// 32-bit atomic unsigned int. +// Each client takes 2 bits. The first bit locates in the first 16 bits of +// buffer_state; the second bit locates in the last 16 bits of buffer_state. // Client states: // Gained state 11. Exclusive write state. // Posted state 10. @@ -42,88 +42,88 @@ namespace BufferHubDefs { // MSB LSB // | | // v v -// [C31|...|C1|C0|C31| ... |C1|C0] +// [C15|...|C1|C0|C15| ... |C1|C0] // Maximum number of clients a buffer can have. -static constexpr int kMaxNumberOfClients = 32; +static constexpr int kMaxNumberOfClients = 16; // Definition of bit masks. // MSB LSB // | kHighBitsMask | kLowbitsMask | // v v v -// [b63| ... |b32|b31| ... |b0] +// [b31| ... |b16|b15| ... |b0] -// The location of lower 32 bits in the 64-bit buffer state. -static constexpr uint64_t kLowbitsMask = (1ULL << kMaxNumberOfClients) - 1ULL; +// The location of lower 16 bits in the 32-bit buffer state. +static constexpr uint32_t kLowbitsMask = (1U << kMaxNumberOfClients) - 1U; -// The location of higher 32 bits in the 64-bit buffer state. -static constexpr uint64_t kHighBitsMask = ~kLowbitsMask; +// The location of higher 16 bits in the 32-bit buffer state. +static constexpr uint32_t kHighBitsMask = ~kLowbitsMask; // The client bit mask of the first client. -static constexpr uint64_t kFirstClientBitMask = (1ULL << kMaxNumberOfClients) + 1ULL; +static constexpr uint32_t kFirstClientBitMask = (1U << kMaxNumberOfClients) + 1U; // Returns true if any of the client is in gained state. -static inline bool AnyClientGained(uint64_t state) { - uint64_t high_bits = state >> kMaxNumberOfClients; - uint64_t low_bits = state & kLowbitsMask; - return high_bits == low_bits && low_bits != 0ULL; +static inline bool AnyClientGained(uint32_t state) { + uint32_t high_bits = state >> kMaxNumberOfClients; + uint32_t low_bits = state & kLowbitsMask; + return high_bits == low_bits && low_bits != 0U; } // Returns true if the input client is in gained state. -static inline bool IsClientGained(uint64_t state, uint64_t client_bit_mask) { +static inline bool IsClientGained(uint32_t state, uint32_t client_bit_mask) { return state == client_bit_mask; } // Returns true if any of the client is in posted state. -static inline bool AnyClientPosted(uint64_t state) { - uint64_t high_bits = state >> kMaxNumberOfClients; - uint64_t low_bits = state & kLowbitsMask; - uint64_t posted_or_acquired = high_bits ^ low_bits; +static inline bool AnyClientPosted(uint32_t state) { + uint32_t high_bits = state >> kMaxNumberOfClients; + uint32_t low_bits = state & kLowbitsMask; + uint32_t posted_or_acquired = high_bits ^ low_bits; return posted_or_acquired & high_bits; } // Returns true if the input client is in posted state. -static inline bool IsClientPosted(uint64_t state, uint64_t client_bit_mask) { - uint64_t client_bits = state & client_bit_mask; - if (client_bits == 0ULL) return false; - uint64_t low_bits = client_bits & kLowbitsMask; - return low_bits == 0ULL; +static inline bool IsClientPosted(uint32_t state, uint32_t client_bit_mask) { + uint32_t client_bits = state & client_bit_mask; + if (client_bits == 0U) return false; + uint32_t low_bits = client_bits & kLowbitsMask; + return low_bits == 0U; } // Return true if any of the client is in acquired state. -static inline bool AnyClientAcquired(uint64_t state) { - uint64_t high_bits = state >> kMaxNumberOfClients; - uint64_t low_bits = state & kLowbitsMask; - uint64_t posted_or_acquired = high_bits ^ low_bits; +static inline bool AnyClientAcquired(uint32_t state) { + uint32_t high_bits = state >> kMaxNumberOfClients; + uint32_t low_bits = state & kLowbitsMask; + uint32_t posted_or_acquired = high_bits ^ low_bits; return posted_or_acquired & low_bits; } // Return true if the input client is in acquired state. -static inline bool IsClientAcquired(uint64_t state, uint64_t client_bit_mask) { - uint64_t client_bits = state & client_bit_mask; - if (client_bits == 0ULL) return false; - uint64_t high_bits = client_bits & kHighBitsMask; - return high_bits == 0ULL; +static inline bool IsClientAcquired(uint32_t state, uint32_t client_bit_mask) { + uint32_t client_bits = state & client_bit_mask; + if (client_bits == 0U) return false; + uint32_t high_bits = client_bits & kHighBitsMask; + return high_bits == 0U; } // Returns true if all clients are in released state. -static inline bool IsBufferReleased(uint64_t state) { - return state == 0ULL; +static inline bool IsBufferReleased(uint32_t state) { + return state == 0U; } // Returns true if the input client is in released state. -static inline bool IsClientReleased(uint64_t state, uint64_t client_bit_mask) { - return (state & client_bit_mask) == 0ULL; +static inline bool IsClientReleased(uint32_t state, uint32_t client_bit_mask) { + return (state & client_bit_mask) == 0U; } // Returns the next available buffer client's client_state_masks. // @params union_bits. Union of all existing clients' client_state_masks. -static inline uint64_t FindNextAvailableClientStateMask(uint64_t union_bits) { - uint64_t low_union = union_bits & kLowbitsMask; - if (low_union == kLowbitsMask) return 0ULL; - uint64_t incremented = low_union + 1ULL; - uint64_t difference = incremented ^ low_union; - uint64_t new_low_bit = (difference + 1ULL) >> 1; +static inline uint32_t FindNextAvailableClientStateMask(uint32_t union_bits) { + uint32_t low_union = union_bits & kLowbitsMask; + if (low_union == kLowbitsMask) return 0U; + uint32_t incremented = low_union + 1U; + uint32_t difference = incremented ^ low_union; + uint32_t new_low_bit = (difference + 1U) >> 1; return new_low_bit + (new_low_bit << kMaxNumberOfClients); } @@ -135,15 +135,18 @@ struct __attribute__((aligned(8))) MetadataHeader { // Every client takes up one bit from the higher 32 bits and one bit from the lower 32 bits in // buffer_state. - std::atomic<uint64_t> buffer_state; + std::atomic<uint32_t> buffer_state; // Every client takes up one bit in fence_state. Only the lower 32 bits are valid. The upper 32 // bits are there for easier manipulation, but the value should be ignored. - std::atomic<uint64_t> fence_state; + std::atomic<uint32_t> fence_state; // Every client takes up one bit from the higher 32 bits and one bit from the lower 32 bits in // active_clients_bit_mask. - std::atomic<uint64_t> active_clients_bit_mask; + std::atomic<uint32_t> active_clients_bit_mask; + + // Explicit padding 4 bytes. + uint32_t padding; // The index of the buffer queue where the buffer belongs to. uint64_t queue_index; @@ -152,7 +155,7 @@ struct __attribute__((aligned(8))) MetadataHeader { DvrNativeBufferMetadata metadata; }; -static_assert(sizeof(MetadataHeader) == 136, "Unexpected MetadataHeader size"); +static_assert(sizeof(MetadataHeader) == 128, "Unexpected MetadataHeader size"); static constexpr size_t kMetadataHeaderSize = sizeof(MetadataHeader); } // namespace BufferHubDefs diff --git a/libs/ui/tests/BufferHubBuffer_test.cpp b/libs/ui/tests/BufferHubBuffer_test.cpp index f616785387..a894f201c5 100644 --- a/libs/ui/tests/BufferHubBuffer_test.cpp +++ b/libs/ui/tests/BufferHubBuffer_test.cpp @@ -67,9 +67,9 @@ protected: } std::unique_ptr<BufferHubBuffer> b1; - uint64_t b1ClientMask = 0ULL; + uint64_t b1ClientMask = 0U; std::unique_ptr<BufferHubBuffer> b2; - uint64_t b2ClientMask = 0ULL; + uint64_t b2ClientMask = 0U; private: // Creates b1 and b2 as the clients of the same buffer for testing. @@ -79,13 +79,13 @@ private: void BufferHubBufferStateTransitionTest::CreateTwoClientsOfABuffer() { b1 = BufferHubBuffer::Create(kWidth, kHeight, kLayerCount, kFormat, kUsage, kUserMetadataSize); b1ClientMask = b1->client_state_mask(); - ASSERT_NE(b1ClientMask, 0ULL); + ASSERT_NE(b1ClientMask, 0U); auto statusOrHandle = b1->Duplicate(); ASSERT_TRUE(statusOrHandle); LocalChannelHandle h2 = statusOrHandle.take(); b2 = BufferHubBuffer::Import(std::move(h2)); b2ClientMask = b2->client_state_mask(); - ASSERT_NE(b2ClientMask, 0ULL); + ASSERT_NE(b2ClientMask, 0U); ASSERT_NE(b2ClientMask, b1ClientMask); } @@ -126,7 +126,7 @@ TEST_F(BufferHubBufferTest, DuplicateBufferHubBuffer) { kUserMetadataSize); int id1 = b1->id(); uint64_t bufferStateMask1 = b1->client_state_mask(); - EXPECT_NE(bufferStateMask1, 0ULL); + EXPECT_NE(bufferStateMask1, 0U); EXPECT_TRUE(b1->IsValid()); EXPECT_EQ(b1->user_metadata_size(), kUserMetadataSize); @@ -149,7 +149,7 @@ TEST_F(BufferHubBufferTest, DuplicateBufferHubBuffer) { int id2 = b2->id(); uint64_t bufferStateMask2 = b2->client_state_mask(); - EXPECT_NE(bufferStateMask2, 0ULL); + EXPECT_NE(bufferStateMask2, 0U); // These two buffer instances are based on the same physical buffer under the // hood, so they should share the same id. diff --git a/libs/vr/libbufferhub/buffer_hub-test.cpp b/libs/vr/libbufferhub/buffer_hub-test.cpp index c3fa77b958..6cb6541c52 100644 --- a/libs/vr/libbufferhub/buffer_hub-test.cpp +++ b/libs/vr/libbufferhub/buffer_hub-test.cpp @@ -175,7 +175,7 @@ TEST_F(LibBufferHubTest, TestStateMask) { ASSERT_TRUE(p.get() != nullptr); // It's ok to create up to kMaxConsumerCount consumer buffers. - uint64_t client_state_masks = p->client_state_mask(); + uint32_t client_state_masks = p->client_state_mask(); std::array<std::unique_ptr<ConsumerBuffer>, kMaxConsumerCount> cs; for (size_t i = 0; i < kMaxConsumerCount; i++) { cs[i] = ConsumerBuffer::Import(p->CreateConsumer()); @@ -184,7 +184,7 @@ TEST_F(LibBufferHubTest, TestStateMask) { EXPECT_EQ(client_state_masks & cs[i]->client_state_mask(), 0U); client_state_masks |= cs[i]->client_state_mask(); } - EXPECT_EQ(client_state_masks, ~0ULL); + EXPECT_EQ(client_state_masks, ~0U); // The 64th creation will fail with out-of-memory error. auto state = p->CreateConsumer(); @@ -373,7 +373,7 @@ TEST_F(LibBufferHubTest, TestMaxConsumers) { std::unique_ptr<ProducerBuffer> p = ProducerBuffer::Create( kWidth, kHeight, kFormat, kUsage, sizeof(uint64_t)); ASSERT_TRUE(p.get() != nullptr); - uint64_t producer_state_mask = p->client_state_mask(); + uint32_t producer_state_mask = p->client_state_mask(); std::array<std::unique_ptr<ConsumerBuffer>, kMaxConsumerCount> cs; for (size_t i = 0; i < kMaxConsumerCount; ++i) { @@ -719,7 +719,7 @@ TEST_F(LibBufferHubTest, TestOrphanedAcquire) { std::unique_ptr<ConsumerBuffer> c1 = ConsumerBuffer::Import(p->CreateConsumer()); ASSERT_TRUE(c1.get() != nullptr); - const uint64_t client_state_mask1 = c1->client_state_mask(); + const uint32_t client_state_mask1 = c1->client_state_mask(); EXPECT_EQ(0, p->GainAsync()); DvrNativeBufferMetadata meta; @@ -739,7 +739,7 @@ TEST_F(LibBufferHubTest, TestOrphanedAcquire) { std::unique_ptr<ConsumerBuffer> c2 = ConsumerBuffer::Import(p->CreateConsumer()); ASSERT_TRUE(c2.get() != nullptr); - const uint64_t client_state_mask2 = c2->client_state_mask(); + const uint32_t client_state_mask2 = c2->client_state_mask(); EXPECT_NE(client_state_mask1, client_state_mask2); EXPECT_EQ(0, RETRY_EINTR(c2->Poll(kPollTimeoutMs))); EXPECT_EQ(-EBUSY, c2->AcquireAsync(&meta, &fence)); @@ -755,7 +755,7 @@ TEST_F(LibBufferHubTest, TestAcquireLastPosted) { std::unique_ptr<ConsumerBuffer> c1 = ConsumerBuffer::Import(p->CreateConsumer()); ASSERT_TRUE(c1.get() != nullptr); - const uint64_t client_state_mask1 = c1->client_state_mask(); + const uint32_t client_state_mask1 = c1->client_state_mask(); EXPECT_EQ(0, p->GainAsync()); DvrNativeBufferMetadata meta; @@ -767,7 +767,7 @@ TEST_F(LibBufferHubTest, TestAcquireLastPosted) { std::unique_ptr<ConsumerBuffer> c2 = ConsumerBuffer::Import(p->CreateConsumer()); ASSERT_TRUE(c2.get() != nullptr); - const uint64_t client_state_mask2 = c2->client_state_mask(); + const uint32_t client_state_mask2 = c2->client_state_mask(); EXPECT_NE(client_state_mask1, client_state_mask2); EXPECT_LT(0, RETRY_EINTR(c2->Poll(kPollTimeoutMs))); LocalHandle invalid_fence; @@ -781,7 +781,7 @@ TEST_F(LibBufferHubTest, TestAcquireLastPosted) { std::unique_ptr<ConsumerBuffer> c3 = ConsumerBuffer::Import(p->CreateConsumer()); ASSERT_TRUE(c3.get() != nullptr); - const uint64_t client_state_mask3 = c3->client_state_mask(); + const uint32_t client_state_mask3 = c3->client_state_mask(); EXPECT_NE(client_state_mask1, client_state_mask3); EXPECT_NE(client_state_mask2, client_state_mask3); EXPECT_LT(0, RETRY_EINTR(c3->Poll(kPollTimeoutMs))); @@ -802,7 +802,7 @@ TEST_F(LibBufferHubTest, TestAcquireLastPosted) { std::unique_ptr<ConsumerBuffer> c4 = ConsumerBuffer::Import(p->CreateConsumer()); ASSERT_TRUE(c4.get() != nullptr); - const uint64_t client_state_mask4 = c4->client_state_mask(); + const uint32_t client_state_mask4 = c4->client_state_mask(); EXPECT_NE(client_state_mask3, client_state_mask4); EXPECT_GE(0, RETRY_EINTR(c3->Poll(kPollTimeoutMs))); EXPECT_EQ(-EBUSY, c3->AcquireAsync(&meta, &invalid_fence)); @@ -952,7 +952,7 @@ TEST_F(LibBufferHubTest, TestDuplicateBufferHubBuffer) { int b1_id = b1->id(); EXPECT_TRUE(b1->IsValid()); EXPECT_EQ(b1->user_metadata_size(), kUserMetadataSize); - EXPECT_NE(b1->client_state_mask(), 0ULL); + EXPECT_NE(b1->client_state_mask(), 0U); auto status_or_handle = b1->Duplicate(); EXPECT_TRUE(status_or_handle); @@ -970,7 +970,7 @@ TEST_F(LibBufferHubTest, TestDuplicateBufferHubBuffer) { ASSERT_TRUE(b2 != nullptr); EXPECT_TRUE(b2->IsValid()); EXPECT_EQ(b2->user_metadata_size(), kUserMetadataSize); - EXPECT_NE(b2->client_state_mask(), 0ULL); + EXPECT_NE(b2->client_state_mask(), 0U); int b2_id = b2->id(); diff --git a/libs/vr/libbufferhub/buffer_hub_base.cpp b/libs/vr/libbufferhub/buffer_hub_base.cpp index 2dc427aec1..8497f3edc1 100644 --- a/libs/vr/libbufferhub/buffer_hub_base.cpp +++ b/libs/vr/libbufferhub/buffer_hub_base.cpp @@ -124,16 +124,16 @@ int BufferHubBase::ImportBuffer() { // memory region will be preserved. buffer_state_ = &metadata_header_->buffer_state; ALOGD_IF(TRACE, - "BufferHubBase::ImportBuffer: id=%d, buffer_state=%" PRIx64 ".", + "BufferHubBase::ImportBuffer: id=%d, buffer_state=%" PRIx32 ".", id(), buffer_state_->load(std::memory_order_acquire)); fence_state_ = &metadata_header_->fence_state; ALOGD_IF(TRACE, - "BufferHubBase::ImportBuffer: id=%d, fence_state=%" PRIx64 ".", id(), + "BufferHubBase::ImportBuffer: id=%d, fence_state=%" PRIx32 ".", id(), fence_state_->load(std::memory_order_acquire)); active_clients_bit_mask_ = &metadata_header_->active_clients_bit_mask; ALOGD_IF( TRACE, - "BufferHubBase::ImportBuffer: id=%d, active_clients_bit_mask=%" PRIx64 + "BufferHubBase::ImportBuffer: id=%d, active_clients_bit_mask=%" PRIx32 ".", id(), active_clients_bit_mask_->load(std::memory_order_acquire)); @@ -171,7 +171,7 @@ int BufferHubBase::UpdateSharedFence(const LocalHandle& new_fence, // If ready fence is valid, we put that into the epoll set. epoll_event event; event.events = EPOLLIN; - event.data.u64 = client_state_mask(); + event.data.u32 = client_state_mask(); pending_fence_fd_ = new_fence.Duplicate(); if (epoll_ctl(shared_fence.Get(), EPOLL_CTL_ADD, pending_fence_fd_.Get(), &event) < 0) { diff --git a/libs/vr/libbufferhub/consumer_buffer.cpp b/libs/vr/libbufferhub/consumer_buffer.cpp index 62fb5fd769..b6ca64eef2 100644 --- a/libs/vr/libbufferhub/consumer_buffer.cpp +++ b/libs/vr/libbufferhub/consumer_buffer.cpp @@ -36,33 +36,33 @@ int ConsumerBuffer::LocalAcquire(DvrNativeBufferMetadata* out_meta, return -EINVAL; // The buffer can be acquired iff the buffer state for this client is posted. - uint64_t current_buffer_state = + uint32_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (!BufferHubDefs::IsClientPosted(current_buffer_state, client_state_mask())) { ALOGE( "%s: Failed to acquire the buffer. The buffer is not posted, id=%d " - "state=%" PRIx64 " client_state_mask=%" PRIx64 ".", + "state=%" PRIx32 " client_state_mask=%" PRIx32 ".", __FUNCTION__, id(), current_buffer_state, client_state_mask()); return -EBUSY; } // Change the buffer state for this consumer from posted to acquired. - uint64_t updated_buffer_state = current_buffer_state ^ client_state_mask(); + uint32_t updated_buffer_state = current_buffer_state ^ client_state_mask(); while (!buffer_state_->compare_exchange_weak( current_buffer_state, updated_buffer_state, std::memory_order_acq_rel, std::memory_order_acquire)) { ALOGD( "%s Failed to acquire the buffer. Current buffer state was changed to " - "%" PRIx64 + "%" PRIx32 " when trying to acquire the buffer and modify the buffer state to " - "%" PRIx64 ". About to try again if the buffer is still posted.", + "%" PRIx32 ". About to try again if the buffer is still posted.", __FUNCTION__, current_buffer_state, updated_buffer_state); if (!BufferHubDefs::IsClientPosted(current_buffer_state, client_state_mask())) { ALOGE( "%s: Failed to acquire the buffer. The buffer is no longer posted, " - "id=%d state=%" PRIx64 " client_state_mask=%" PRIx64 ".", + "id=%d state=%" PRIx32 " client_state_mask=%" PRIx32 ".", __FUNCTION__, id(), current_buffer_state, client_state_mask()); return -EBUSY; } @@ -81,7 +81,7 @@ int ConsumerBuffer::LocalAcquire(DvrNativeBufferMetadata* out_meta, out_meta->user_metadata_ptr = 0; } - uint64_t fence_state = fence_state_->load(std::memory_order_acquire); + uint32_t fence_state = fence_state_->load(std::memory_order_acquire); // If there is an acquire fence from producer, we need to return it. // The producer state bit mask is kFirstClientBitMask for now. if (fence_state & BufferHubDefs::kFirstClientBitMask) { @@ -142,21 +142,21 @@ int ConsumerBuffer::LocalRelease(const DvrNativeBufferMetadata* meta, // Set the buffer state of this client to released if it is not already in // released state. - uint64_t current_buffer_state = + uint32_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (BufferHubDefs::IsClientReleased(current_buffer_state, client_state_mask())) { return 0; } - uint64_t updated_buffer_state = current_buffer_state & (~client_state_mask()); + uint32_t updated_buffer_state = current_buffer_state & (~client_state_mask()); while (!buffer_state_->compare_exchange_weak( current_buffer_state, updated_buffer_state, std::memory_order_acq_rel, std::memory_order_acquire)) { ALOGD( "%s: Failed to release the buffer. Current buffer state was changed to " - "%" PRIx64 + "%" PRIx32 " when trying to release the buffer and modify the buffer state to " - "%" PRIx64 ". About to try again.", + "%" PRIx32 ". About to try again.", __FUNCTION__, current_buffer_state, updated_buffer_state); // The failure of compare_exchange_weak updates current_buffer_state. updated_buffer_state = current_buffer_state & (~client_state_mask()); diff --git a/libs/vr/libbufferhub/include/private/dvr/buffer_hub_base.h b/libs/vr/libbufferhub/include/private/dvr/buffer_hub_base.h index 09feb73f81..440a59dc71 100644 --- a/libs/vr/libbufferhub/include/private/dvr/buffer_hub_base.h +++ b/libs/vr/libbufferhub/include/private/dvr/buffer_hub_base.h @@ -90,13 +90,13 @@ class BufferHubBase : public pdx::Client { int cid() const { return cid_; } // Returns the buffer buffer state. - uint64_t buffer_state() { + uint32_t buffer_state() { return buffer_state_->load(std::memory_order_acquire); }; // A state mask which is unique to a buffer hub client among all its siblings // sharing the same concrete graphic buffer. - uint64_t client_state_mask() const { return client_state_mask_; } + uint32_t client_state_mask() const { return client_state_mask_; } // The following methods return settings of the first buffer. Currently, // it is only possible to create multi-buffer BufferHubBases with the same @@ -132,11 +132,11 @@ class BufferHubBase : public pdx::Client { // IonBuffer that is shared between bufferhubd, producer, and consumers. size_t metadata_buf_size_{0}; size_t user_metadata_size_{0}; - BufferHubDefs::MetadataHeader* metadata_header_{nullptr}; - void* user_metadata_ptr_{nullptr}; - std::atomic<uint64_t>* buffer_state_{nullptr}; - std::atomic<uint64_t>* fence_state_{nullptr}; - std::atomic<uint64_t>* active_clients_bit_mask_{nullptr}; + BufferHubDefs::MetadataHeader* metadata_header_ = nullptr; + void* user_metadata_ptr_ = nullptr; + std::atomic<uint32_t>* buffer_state_ = nullptr; + std::atomic<uint32_t>* fence_state_ = nullptr; + std::atomic<uint32_t>* active_clients_bit_mask_ = nullptr; LocalHandle shared_acquire_fence_; LocalHandle shared_release_fence_; @@ -159,7 +159,7 @@ class BufferHubBase : public pdx::Client { // Client bit mask which indicates the locations of this client object in the // buffer_state_. - uint64_t client_state_mask_{0ULL}; + uint32_t client_state_mask_{0U}; IonBuffer buffer_; IonBuffer metadata_buffer_; }; diff --git a/libs/vr/libbufferhub/include/private/dvr/buffer_hub_defs.h b/libs/vr/libbufferhub/include/private/dvr/buffer_hub_defs.h index 2de36f26a6..f2c40fe3d3 100644 --- a/libs/vr/libbufferhub/include/private/dvr/buffer_hub_defs.h +++ b/libs/vr/libbufferhub/include/private/dvr/buffer_hub_defs.h @@ -22,46 +22,46 @@ static constexpr uint32_t kMetadataUsage = // See more details in libs/ui/include/ui/BufferHubDefs.h static constexpr int kMaxNumberOfClients = android::BufferHubDefs::kMaxNumberOfClients; -static constexpr uint64_t kLowbitsMask = android::BufferHubDefs::kLowbitsMask; -static constexpr uint64_t kHighBitsMask = android::BufferHubDefs::kHighBitsMask; -static constexpr uint64_t kFirstClientBitMask = +static constexpr uint32_t kLowbitsMask = android::BufferHubDefs::kLowbitsMask; +static constexpr uint32_t kHighBitsMask = android::BufferHubDefs::kHighBitsMask; +static constexpr uint32_t kFirstClientBitMask = android::BufferHubDefs::kFirstClientBitMask; -static inline bool AnyClientGained(uint64_t state) { +static inline bool AnyClientGained(uint32_t state) { return android::BufferHubDefs::AnyClientGained(state); } -static inline bool IsClientGained(uint64_t state, uint64_t client_bit_mask) { +static inline bool IsClientGained(uint32_t state, uint32_t client_bit_mask) { return android::BufferHubDefs::IsClientGained(state, client_bit_mask); } -static inline bool AnyClientPosted(uint64_t state) { +static inline bool AnyClientPosted(uint32_t state) { return android::BufferHubDefs::AnyClientPosted(state); } -static inline bool IsClientPosted(uint64_t state, uint64_t client_bit_mask) { +static inline bool IsClientPosted(uint32_t state, uint32_t client_bit_mask) { return android::BufferHubDefs::IsClientPosted(state, client_bit_mask); } -static inline bool AnyClientAcquired(uint64_t state) { +static inline bool AnyClientAcquired(uint32_t state) { return android::BufferHubDefs::AnyClientAcquired(state); } -static inline bool IsClientAcquired(uint64_t state, uint64_t client_bit_mask) { +static inline bool IsClientAcquired(uint32_t state, uint32_t client_bit_mask) { return android::BufferHubDefs::IsClientAcquired(state, client_bit_mask); } -static inline bool IsBufferReleased(uint64_t state) { +static inline bool IsBufferReleased(uint32_t state) { return android::BufferHubDefs::IsBufferReleased(state); } -static inline bool IsClientReleased(uint64_t state, uint64_t client_bit_mask) { +static inline bool IsClientReleased(uint32_t state, uint32_t client_bit_mask) { return android::BufferHubDefs::IsClientReleased(state, client_bit_mask); } // Returns the next available buffer client's client_state_masks. // @params union_bits. Union of all existing clients' client_state_masks. -static inline uint64_t FindNextAvailableClientStateMask(uint64_t union_bits) { +static inline uint32_t FindNextAvailableClientStateMask(uint32_t union_bits) { return android::BufferHubDefs::FindNextAvailableClientStateMask(union_bits); } @@ -77,7 +77,7 @@ class BufferTraits { BufferTraits() = default; BufferTraits(const native_handle_t* buffer_handle, const FileHandleType& metadata_handle, int id, - uint64_t client_state_mask, uint64_t metadata_size, + uint32_t client_state_mask, uint64_t metadata_size, uint32_t width, uint32_t height, uint32_t layer_count, uint32_t format, uint64_t usage, uint32_t stride, const FileHandleType& acquire_fence_fd, @@ -107,7 +107,7 @@ class BufferTraits { // same buffer channel has uniqued state bit among its siblings. For a // producer buffer the bit must be kFirstClientBitMask; for a consumer the bit // must be one of the kConsumerStateMask. - uint64_t client_state_mask() const { return client_state_mask_; } + uint32_t client_state_mask() const { return client_state_mask_; } uint64_t metadata_size() const { return metadata_size_; } uint32_t width() { return width_; } @@ -131,7 +131,7 @@ class BufferTraits { private: // BufferHub specific traits. int id_ = -1; - uint64_t client_state_mask_; + uint32_t client_state_mask_; uint64_t metadata_size_; // Traits for a GraphicBuffer. diff --git a/libs/vr/libbufferhub/include/private/dvr/bufferhub_rpc.h b/libs/vr/libbufferhub/include/private/dvr/bufferhub_rpc.h index 5ff4e00a01..f1cd0b4adc 100644 --- a/libs/vr/libbufferhub/include/private/dvr/bufferhub_rpc.h +++ b/libs/vr/libbufferhub/include/private/dvr/bufferhub_rpc.h @@ -99,7 +99,7 @@ class BufferDescription { public: BufferDescription() = default; BufferDescription(const IonBuffer& buffer, const IonBuffer& metadata, int id, - int buffer_cid, uint64_t client_state_mask, + int buffer_cid, uint32_t client_state_mask, const FileHandleType& acquire_fence_fd, const FileHandleType& release_fence_fd) : id_(id), @@ -123,7 +123,7 @@ class BufferDescription { // State mask of the buffer client. Each BufferHub client backed by the // same buffer channel has uniqued state bit among its siblings. - uint64_t client_state_mask() const { return client_state_mask_; } + uint32_t client_state_mask() const { return client_state_mask_; } FileHandleType take_acquire_fence() { return std::move(acquire_fence_fd_); } FileHandleType take_release_fence() { return std::move(release_fence_fd_); } @@ -133,7 +133,7 @@ class BufferDescription { private: int id_{-1}; int buffer_cid_{-1}; - uint64_t client_state_mask_{0}; + uint32_t client_state_mask_{0U}; // Two IonBuffers: one for the graphic buffer and one for metadata. NativeBufferHandle<FileHandleType> buffer_; NativeBufferHandle<FileHandleType> metadata_; diff --git a/libs/vr/libbufferhub/producer_buffer.cpp b/libs/vr/libbufferhub/producer_buffer.cpp index cd92b625d5..5274bf25d5 100644 --- a/libs/vr/libbufferhub/producer_buffer.cpp +++ b/libs/vr/libbufferhub/producer_buffer.cpp @@ -80,20 +80,20 @@ int ProducerBuffer::LocalPost(const DvrNativeBufferMetadata* meta, return error; // The buffer can be posted iff the buffer state for this client is gained. - uint64_t current_buffer_state = + uint32_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (!BufferHubDefs::IsClientGained(current_buffer_state, client_state_mask())) { - ALOGE("%s: not gained, id=%d state=%" PRIx64 ".", __FUNCTION__, id(), + ALOGE("%s: not gained, id=%d state=%" PRIx32 ".", __FUNCTION__, id(), current_buffer_state); return -EBUSY; } // Set the producer client buffer state to released, other clients' buffer // state to posted. - uint64_t current_active_clients_bit_mask = + uint32_t current_active_clients_bit_mask = active_clients_bit_mask_->load(std::memory_order_acquire); - uint64_t updated_buffer_state = current_active_clients_bit_mask & + uint32_t updated_buffer_state = current_active_clients_bit_mask & (~client_state_mask()) & BufferHubDefs::kHighBitsMask; while (!buffer_state_->compare_exchange_weak( @@ -101,16 +101,16 @@ int ProducerBuffer::LocalPost(const DvrNativeBufferMetadata* meta, std::memory_order_acquire)) { ALOGD( "%s: Failed to post the buffer. Current buffer state was changed to " - "%" PRIx64 + "%" PRIx32 " when trying to post the buffer and modify the buffer state to " - "%" PRIx64 + "%" PRIx32 ". About to try again if the buffer is still gained by this client.", __FUNCTION__, current_buffer_state, updated_buffer_state); if (!BufferHubDefs::IsClientGained(current_buffer_state, client_state_mask())) { ALOGE( "%s: Failed to post the buffer. The buffer is no longer gained, " - "id=%d state=%" PRIx64 ".", + "id=%d state=%" PRIx32 ".", __FUNCTION__, id(), current_buffer_state); return -EBUSY; } @@ -164,9 +164,9 @@ int ProducerBuffer::LocalGain(DvrNativeBufferMetadata* out_meta, if (!out_meta) return -EINVAL; - uint64_t current_buffer_state = + uint32_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); - ALOGD_IF(TRACE, "%s: buffer=%d, state=%" PRIx64 ".", __FUNCTION__, id(), + ALOGD_IF(TRACE, "%s: buffer=%d, state=%" PRIx32 ".", __FUNCTION__, id(), current_buffer_state); if (BufferHubDefs::IsClientGained(current_buffer_state, @@ -178,20 +178,20 @@ int ProducerBuffer::LocalGain(DvrNativeBufferMetadata* out_meta, BufferHubDefs::AnyClientGained(current_buffer_state) || (BufferHubDefs::AnyClientPosted(current_buffer_state) && !gain_posted_buffer)) { - ALOGE("%s: not released id=%d state=%" PRIx64 ".", __FUNCTION__, id(), + ALOGE("%s: not released id=%d state=%" PRIx32 ".", __FUNCTION__, id(), current_buffer_state); return -EBUSY; } // Change the buffer state to gained state. - uint64_t updated_buffer_state = client_state_mask(); + uint32_t updated_buffer_state = client_state_mask(); while (!buffer_state_->compare_exchange_weak( current_buffer_state, updated_buffer_state, std::memory_order_acq_rel, std::memory_order_acquire)) { ALOGD( "%s: Failed to gain the buffer. Current buffer state was changed to " - "%" PRIx64 + "%" PRIx32 " when trying to gain the buffer and modify the buffer state to " - "%" PRIx64 + "%" PRIx32 ". About to try again if the buffer is still not read by other " "clients.", __FUNCTION__, current_buffer_state, updated_buffer_state); @@ -202,7 +202,7 @@ int ProducerBuffer::LocalGain(DvrNativeBufferMetadata* out_meta, !gain_posted_buffer)) { ALOGE( "%s: Failed to gain the buffer. The buffer is no longer released. " - "id=%d state=%" PRIx64 ".", + "id=%d state=%" PRIx32 ".", __FUNCTION__, id(), current_buffer_state); return -EBUSY; } @@ -221,8 +221,8 @@ int ProducerBuffer::LocalGain(DvrNativeBufferMetadata* out_meta, out_meta->user_metadata_ptr = 0; } - uint64_t current_fence_state = fence_state_->load(std::memory_order_acquire); - uint64_t current_active_clients_bit_mask = + uint32_t current_fence_state = fence_state_->load(std::memory_order_acquire); + uint32_t current_active_clients_bit_mask = active_clients_bit_mask_->load(std::memory_order_acquire); // If there are release fence(s) from consumer(s), we need to return it to the // consumer(s). @@ -289,11 +289,11 @@ Status<LocalChannelHandle> ProducerBuffer::Detach() { // TODO(b/112338294) Keep here for reference. Remove it after new logic is // written. - /* uint64_t buffer_state = buffer_state_->load(std::memory_order_acquire); + /* uint32_t buffer_state = buffer_state_->load(std::memory_order_acquire); if (!BufferHubDefs::IsClientGained( buffer_state, BufferHubDefs::kFirstClientStateMask)) { // Can only detach a ProducerBuffer when it's in gained state. - ALOGW("ProducerBuffer::Detach: The buffer (id=%d, state=0x%" PRIx64 + ALOGW("ProducerBuffer::Detach: The buffer (id=%d, state=0x%" PRIx32 ") is not in gained state.", id(), buffer_state); return {}; diff --git a/libs/vr/libdvr/include/dvr/dvr_api.h b/libs/vr/libdvr/include/dvr/dvr_api.h index a204f62fff..e383bb2cb3 100644 --- a/libs/vr/libdvr/include/dvr/dvr_api.h +++ b/libs/vr/libdvr/include/dvr/dvr_api.h @@ -466,11 +466,11 @@ struct ALIGNED_DVR_STRUCT(8) DvrNativeBufferMetadata { // Only applicable for metadata retrieved from GainAsync. This indicates which // consumer has pending fence that producer should epoll on. - uint64_t release_fence_mask; + uint32_t release_fence_mask; // Reserved bytes for so that the struct is forward compatible and padding to // 104 bytes so the size is a multiple of 8. - int32_t reserved[8]; + int32_t reserved[9]; }; #ifdef __cplusplus diff --git a/libs/vr/libdvr/tests/dvr_buffer_queue-test.cpp b/libs/vr/libdvr/tests/dvr_buffer_queue-test.cpp index 2d5f0043e3..df060973ec 100644 --- a/libs/vr/libdvr/tests/dvr_buffer_queue-test.cpp +++ b/libs/vr/libdvr/tests/dvr_buffer_queue-test.cpp @@ -62,7 +62,7 @@ class DvrBufferQueueTest : public DvrApiTest { buffer_removed_count_); } - DvrWriteBufferQueue* write_queue_{nullptr}; + DvrWriteBufferQueue* write_queue_ = nullptr; int buffer_available_count_{0}; int buffer_removed_count_{0}; }; diff --git a/services/bufferhub/BufferNode.cpp b/services/bufferhub/BufferNode.cpp index 4bad829210..cc87e15917 100644 --- a/services/bufferhub/BufferNode.cpp +++ b/services/bufferhub/BufferNode.cpp @@ -14,10 +14,10 @@ void BufferNode::InitializeMetadata() { // Using placement new here to reuse shared memory instead of new allocation // Initialize the atomic variables to zero. BufferHubDefs::MetadataHeader* metadata_header = metadata_.metadata_header(); - buffer_state_ = new (&metadata_header->buffer_state) std::atomic<uint64_t>(0); - fence_state_ = new (&metadata_header->fence_state) std::atomic<uint64_t>(0); + buffer_state_ = new (&metadata_header->buffer_state) std::atomic<uint32_t>(0); + fence_state_ = new (&metadata_header->fence_state) std::atomic<uint32_t>(0); active_clients_bit_mask_ = - new (&metadata_header->active_clients_bit_mask) std::atomic<uint64_t>(0); + new (&metadata_header->active_clients_bit_mask) std::atomic<uint32_t>(0); } // Allocates a new BufferNode. @@ -74,22 +74,22 @@ BufferNode::~BufferNode() { } } -uint64_t BufferNode::GetActiveClientsBitMask() const { +uint32_t BufferNode::GetActiveClientsBitMask() const { return active_clients_bit_mask_->load(std::memory_order_acquire); } -uint64_t BufferNode::AddNewActiveClientsBitToMask() { - uint64_t current_active_clients_bit_mask = GetActiveClientsBitMask(); - uint64_t client_state_mask = 0ULL; - uint64_t updated_active_clients_bit_mask = 0ULL; +uint32_t BufferNode::AddNewActiveClientsBitToMask() { + uint32_t current_active_clients_bit_mask = GetActiveClientsBitMask(); + uint32_t client_state_mask = 0U; + uint32_t updated_active_clients_bit_mask = 0U; do { client_state_mask = BufferHubDefs::FindNextAvailableClientStateMask(current_active_clients_bit_mask); - if (client_state_mask == 0ULL) { + if (client_state_mask == 0U) { ALOGE("%s: reached the maximum number of channels per buffer node: %d.", __FUNCTION__, BufferHubDefs::kMaxNumberOfClients); errno = E2BIG; - return 0ULL; + return 0U; } updated_active_clients_bit_mask = current_active_clients_bit_mask | client_state_mask; } while (!(active_clients_bit_mask_->compare_exchange_weak(current_active_clients_bit_mask, @@ -99,7 +99,7 @@ uint64_t BufferNode::AddNewActiveClientsBitToMask() { return client_state_mask; } -void BufferNode::RemoveClientsBitFromMask(const uint64_t& value) { +void BufferNode::RemoveClientsBitFromMask(const uint32_t& value) { active_clients_bit_mask_->fetch_and(~value); } diff --git a/services/bufferhub/include/bufferhub/BufferHubIdGenerator.h b/services/bufferhub/include/bufferhub/BufferHubIdGenerator.h index c5b2cdef33..b51fcda3cd 100644 --- a/services/bufferhub/include/bufferhub/BufferHubIdGenerator.h +++ b/services/bufferhub/include/bufferhub/BufferHubIdGenerator.h @@ -32,7 +32,7 @@ namespace implementation { class BufferHubIdGenerator { public: // 0 is considered invalid - static constexpr uint32_t kInvalidId = 0UL; + static constexpr uint32_t kInvalidId = 0U; // Get the singleton instance of this class static BufferHubIdGenerator& getInstance(); diff --git a/services/bufferhub/include/bufferhub/BufferNode.h b/services/bufferhub/include/bufferhub/BufferNode.h index 02bb5af0e0..cf56c33ec0 100644 --- a/services/bufferhub/include/bufferhub/BufferNode.h +++ b/services/bufferhub/include/bufferhub/BufferNode.h @@ -38,19 +38,19 @@ public: // Gets the current value of active_clients_bit_mask in metadata_ with // std::memory_order_acquire, so that all previous releases of // active_clients_bit_mask from all threads will be returned here. - uint64_t GetActiveClientsBitMask() const; + uint32_t GetActiveClientsBitMask() const; // Find and add a new client_state_mask to active_clients_bit_mask in // metadata_. // Return the new client_state_mask that is added to active_clients_bit_mask. - // Return 0ULL if there are already 32 bp clients of the buffer. - uint64_t AddNewActiveClientsBitToMask(); + // Return 0U if there are already 16 clients of the buffer. + uint32_t AddNewActiveClientsBitToMask(); // Removes the value from active_clients_bit_mask in metadata_ with // std::memory_order_release, so that the change will be visible to any // acquire of active_clients_bit_mask_ in any threads after the succeed of // this operation. - void RemoveClientsBitFromMask(const uint64_t& value); + void RemoveClientsBitFromMask(const uint32_t& value); private: // Helper method for constructors to initialize atomic metadata header @@ -75,14 +75,14 @@ private: // buffer_state_ tracks the state of the buffer. Buffer can be in one of these // four states: gained, posted, acquired, released. - std::atomic<uint64_t>* buffer_state_ = nullptr; + std::atomic<uint32_t>* buffer_state_ = nullptr; // TODO(b/112012161): add comments to fence_state_. - std::atomic<uint64_t>* fence_state_ = nullptr; + std::atomic<uint32_t>* fence_state_ = nullptr; // active_clients_bit_mask_ tracks all the bp clients of the buffer. It is the // union of all client_state_mask of all bp clients. - std::atomic<uint64_t>* active_clients_bit_mask_ = nullptr; + std::atomic<uint32_t>* active_clients_bit_mask_ = nullptr; }; } // namespace implementation diff --git a/services/bufferhub/tests/BufferNode_test.cpp b/services/bufferhub/tests/BufferNode_test.cpp index 8555eb7800..dbf10e8cc5 100644 --- a/services/bufferhub/tests/BufferNode_test.cpp +++ b/services/bufferhub/tests/BufferNode_test.cpp @@ -56,21 +56,21 @@ TEST_F(BufferNodeTest, TestCreateBufferNode) { } TEST_F(BufferNodeTest, TestAddNewActiveClientsBitToMask_twoNewClients) { - uint64_t new_client_state_mask_1 = buffer_node->AddNewActiveClientsBitToMask(); + uint32_t new_client_state_mask_1 = buffer_node->AddNewActiveClientsBitToMask(); EXPECT_EQ(buffer_node->GetActiveClientsBitMask(), new_client_state_mask_1); // Request and add a new client_state_mask again. // Active clients bit mask should be the union of the two new // client_state_masks. - uint64_t new_client_state_mask_2 = buffer_node->AddNewActiveClientsBitToMask(); + uint32_t new_client_state_mask_2 = buffer_node->AddNewActiveClientsBitToMask(); EXPECT_EQ(buffer_node->GetActiveClientsBitMask(), new_client_state_mask_1 | new_client_state_mask_2); } TEST_F(BufferNodeTest, TestAddNewActiveClientsBitToMask_32NewClients) { - uint64_t new_client_state_mask = 0ULL; - uint64_t current_mask = 0ULL; - uint64_t expected_mask = 0ULL; + uint32_t new_client_state_mask = 0U; + uint32_t current_mask = 0U; + uint32_t expected_mask = 0U; for (int i = 0; i < BufferHubDefs::kMaxNumberOfClients; ++i) { new_client_state_mask = buffer_node->AddNewActiveClientsBitToMask(); @@ -83,14 +83,14 @@ TEST_F(BufferNodeTest, TestAddNewActiveClientsBitToMask_32NewClients) { // Method should fail upon requesting for more than maximum allowable clients. new_client_state_mask = buffer_node->AddNewActiveClientsBitToMask(); - EXPECT_EQ(new_client_state_mask, 0ULL); + EXPECT_EQ(new_client_state_mask, 0U); EXPECT_EQ(errno, E2BIG); } TEST_F(BufferNodeTest, TestRemoveActiveClientsBitFromMask) { buffer_node->AddNewActiveClientsBitToMask(); - uint64_t current_mask = buffer_node->GetActiveClientsBitMask(); - uint64_t new_client_state_mask = buffer_node->AddNewActiveClientsBitToMask(); + uint32_t current_mask = buffer_node->GetActiveClientsBitMask(); + uint32_t new_client_state_mask = buffer_node->AddNewActiveClientsBitToMask(); EXPECT_NE(buffer_node->GetActiveClientsBitMask(), current_mask); buffer_node->RemoveClientsBitFromMask(new_client_state_mask); diff --git a/services/vr/bufferhubd/buffer_channel.cpp b/services/vr/bufferhubd/buffer_channel.cpp index cf072b667d..695396caf2 100644 --- a/services/vr/bufferhubd/buffer_channel.cpp +++ b/services/vr/bufferhubd/buffer_channel.cpp @@ -32,7 +32,7 @@ BufferChannel::BufferChannel(BufferHubService* service, int buffer_id, : BufferHubChannel(service, buffer_id, channel_id, kDetachedBufferType), buffer_node_(buffer_node) { client_state_mask_ = buffer_node_->AddNewActiveClientsBitToMask(); - if (client_state_mask_ == 0ULL) { + if (client_state_mask_ == 0U) { ALOGE("BufferChannel::BufferChannel: %s", strerror(errno)); buffer_node_ = nullptr; } @@ -41,7 +41,7 @@ BufferChannel::BufferChannel(BufferHubService* service, int buffer_id, BufferChannel::~BufferChannel() { ALOGD_IF(TRACE, "BufferChannel::~BufferChannel: channel_id=%d buffer_id=%d.", channel_id(), buffer_id()); - if (client_state_mask_ != 0ULL) { + if (client_state_mask_ != 0U) { buffer_node_->RemoveClientsBitFromMask(client_state_mask_); } Hangup(); diff --git a/services/vr/bufferhubd/consumer_channel.cpp b/services/vr/bufferhubd/consumer_channel.cpp index 158ef9ceaa..c7695bc51f 100644 --- a/services/vr/bufferhubd/consumer_channel.cpp +++ b/services/vr/bufferhubd/consumer_channel.cpp @@ -17,7 +17,7 @@ namespace android { namespace dvr { ConsumerChannel::ConsumerChannel(BufferHubService* service, int buffer_id, - int channel_id, uint64_t client_state_mask, + int channel_id, uint32_t client_state_mask, const std::shared_ptr<Channel> producer) : BufferHubChannel(service, buffer_id, channel_id, kConsumerType), client_state_mask_(client_state_mask), diff --git a/services/vr/bufferhubd/include/private/dvr/buffer_channel.h b/services/vr/bufferhubd/include/private/dvr/buffer_channel.h index 744c095338..9888db6642 100644 --- a/services/vr/bufferhubd/include/private/dvr/buffer_channel.h +++ b/services/vr/bufferhubd/include/private/dvr/buffer_channel.h @@ -51,8 +51,8 @@ class BufferChannel : public BufferHubChannel { // The concrete implementation of the Buffer object. std::shared_ptr<BufferNode> buffer_node_ = nullptr; - // The state bit of this buffer. Must be one the lower 63 bits. - uint64_t client_state_mask_ = 0ULL; + // The state bit of this buffer. + uint32_t client_state_mask_ = 0U; }; } // namespace dvr diff --git a/services/vr/bufferhubd/include/private/dvr/consumer_channel.h b/services/vr/bufferhubd/include/private/dvr/consumer_channel.h index 5fb4ec1725..5ee551f115 100644 --- a/services/vr/bufferhubd/include/private/dvr/consumer_channel.h +++ b/services/vr/bufferhubd/include/private/dvr/consumer_channel.h @@ -16,14 +16,14 @@ class ConsumerChannel : public BufferHubChannel { using Message = pdx::Message; ConsumerChannel(BufferHubService* service, int buffer_id, int channel_id, - uint64_t client_state_mask, + uint32_t client_state_mask, const std::shared_ptr<Channel> producer); ~ConsumerChannel() override; bool HandleMessage(Message& message) override; void HandleImpulse(Message& message) override; - uint64_t client_state_mask() const { return client_state_mask_; } + uint32_t client_state_mask() const { return client_state_mask_; } BufferInfo GetBufferInfo() const override; void OnProducerGained(); @@ -39,7 +39,7 @@ class ConsumerChannel : public BufferHubChannel { pdx::Status<void> OnConsumerRelease(Message& message, LocalFence release_fence); - uint64_t client_state_mask_{0}; + uint32_t client_state_mask_{0U}; bool acquired_{false}; bool released_{true}; std::weak_ptr<Channel> producer_; diff --git a/services/vr/bufferhubd/include/private/dvr/producer_channel.h b/services/vr/bufferhubd/include/private/dvr/producer_channel.h index 4734439196..96ef1a20a0 100644 --- a/services/vr/bufferhubd/include/private/dvr/producer_channel.h +++ b/services/vr/bufferhubd/include/private/dvr/producer_channel.h @@ -42,7 +42,7 @@ class ProducerChannel : public BufferHubChannel { ~ProducerChannel() override; - uint64_t buffer_state() const { + uint32_t buffer_state() const { return buffer_state_->load(std::memory_order_acquire); } @@ -51,18 +51,18 @@ class ProducerChannel : public BufferHubChannel { BufferInfo GetBufferInfo() const override; - BufferDescription<BorrowedHandle> GetBuffer(uint64_t client_state_mask); + BufferDescription<BorrowedHandle> GetBuffer(uint32_t client_state_mask); pdx::Status<RemoteChannelHandle> CreateConsumer(Message& message, - uint64_t consumer_state_mask); - pdx::Status<uint64_t> CreateConsumerStateMask(); + uint32_t consumer_state_mask); + pdx::Status<uint32_t> CreateConsumerStateMask(); pdx::Status<RemoteChannelHandle> OnNewConsumer(Message& message); pdx::Status<LocalFence> OnConsumerAcquire(Message& message); pdx::Status<void> OnConsumerRelease(Message& message, LocalFence release_fence); - void OnConsumerOrphaned(const uint64_t& consumer_state_mask); + void OnConsumerOrphaned(const uint32_t& consumer_state_mask); void AddConsumer(ConsumerChannel* channel); void RemoveConsumer(ConsumerChannel* channel); @@ -79,13 +79,13 @@ class ProducerChannel : public BufferHubChannel { // IonBuffer that is shared between bufferhubd, producer, and consumers. IonBuffer metadata_buffer_; BufferHubDefs::MetadataHeader* metadata_header_ = nullptr; - std::atomic<uint64_t>* buffer_state_ = nullptr; - std::atomic<uint64_t>* fence_state_ = nullptr; - std::atomic<uint64_t>* active_clients_bit_mask_ = nullptr; + std::atomic<uint32_t>* buffer_state_ = nullptr; + std::atomic<uint32_t>* fence_state_ = nullptr; + std::atomic<uint32_t>* active_clients_bit_mask_ = nullptr; // All orphaned consumer bits. Valid bits are the lower 63 bits, while the // highest bit is reserved for the producer and should not be set. - uint64_t orphaned_consumer_bit_mask_{0ULL}; + uint32_t orphaned_consumer_bit_mask_{0U}; LocalFence post_fence_; LocalFence returned_fence_; @@ -110,7 +110,7 @@ class ProducerChannel : public BufferHubChannel { // Remove consumer from atomics in shared memory based on consumer_state_mask. // This function is used for clean up for failures in CreateConsumer method. - void RemoveConsumerClientMask(uint64_t consumer_state_mask); + void RemoveConsumerClientMask(uint32_t consumer_state_mask); ProducerChannel(const ProducerChannel&) = delete; void operator=(const ProducerChannel&) = delete; diff --git a/services/vr/bufferhubd/producer_channel.cpp b/services/vr/bufferhubd/producer_channel.cpp index b541fb3963..1682bfeb33 100644 --- a/services/vr/bufferhubd/producer_channel.cpp +++ b/services/vr/bufferhubd/producer_channel.cpp @@ -93,10 +93,10 @@ int ProducerChannel::InitializeBuffer() { // Using placement new here to reuse shared memory instead of new allocation // and also initialize the value to zero. buffer_state_ = - new (&metadata_header_->buffer_state) std::atomic<uint64_t>(0); - fence_state_ = new (&metadata_header_->fence_state) std::atomic<uint64_t>(0); + new (&metadata_header_->buffer_state) std::atomic<uint32_t>(0); + fence_state_ = new (&metadata_header_->fence_state) std::atomic<uint32_t>(0); active_clients_bit_mask_ = - new (&metadata_header_->active_clients_bit_mask) std::atomic<uint64_t>(0); + new (&metadata_header_->active_clients_bit_mask) std::atomic<uint32_t>(0); // Producer channel is never created after consumer channel, and one buffer // only have one fixed producer for now. Thus, it is correct to assume @@ -119,7 +119,7 @@ int ProducerChannel::InitializeBuffer() { epoll_event event; event.events = 0; - event.data.u64 = 0ULL; + event.data.u32 = 0U; if (epoll_ctl(release_fence_fd_.Get(), EPOLL_CTL_ADD, dummy_fence_fd_.Get(), &event) < 0) { ALOGE( @@ -164,7 +164,7 @@ Status<std::shared_ptr<ProducerChannel>> ProducerChannel::Create( ProducerChannel::~ProducerChannel() { ALOGD_IF(TRACE, "ProducerChannel::~ProducerChannel: channel_id=%d buffer_id=%d " - "state=%" PRIx64 ".", + "state=%" PRIx32 ".", channel_id(), buffer_id(), buffer_state_->load(std::memory_order_acquire)); for (auto consumer : consumer_channels_) { @@ -175,7 +175,7 @@ ProducerChannel::~ProducerChannel() { BufferHubChannel::BufferInfo ProducerChannel::GetBufferInfo() const { // Derive the mask of signaled buffers in this producer / consumer set. - uint64_t signaled_mask = signaled() ? BufferHubDefs::kFirstClientBitMask : 0; + uint32_t signaled_mask = signaled() ? BufferHubDefs::kFirstClientBitMask : 0; for (const ConsumerChannel* consumer : consumer_channels_) { signaled_mask |= consumer->signaled() ? consumer->client_state_mask() : 0; } @@ -228,7 +228,7 @@ bool ProducerChannel::HandleMessage(Message& message) { } BufferDescription<BorrowedHandle> ProducerChannel::GetBuffer( - uint64_t client_state_mask) { + uint32_t client_state_mask) { return {buffer_, metadata_buffer_, buffer_id(), @@ -241,27 +241,27 @@ BufferDescription<BorrowedHandle> ProducerChannel::GetBuffer( Status<BufferDescription<BorrowedHandle>> ProducerChannel::OnGetBuffer( Message& /*message*/) { ATRACE_NAME("ProducerChannel::OnGetBuffer"); - ALOGD_IF(TRACE, "ProducerChannel::OnGetBuffer: buffer=%d, state=%" PRIx64 ".", + ALOGD_IF(TRACE, "ProducerChannel::OnGetBuffer: buffer=%d, state=%" PRIx32 ".", buffer_id(), buffer_state_->load(std::memory_order_acquire)); return {GetBuffer(BufferHubDefs::kFirstClientBitMask)}; } -Status<uint64_t> ProducerChannel::CreateConsumerStateMask() { +Status<uint32_t> ProducerChannel::CreateConsumerStateMask() { // Try find the next consumer state bit which has not been claimed by any // consumer yet. // memory_order_acquire is chosen here because all writes in other threads // that release active_clients_bit_mask_ need to be visible here. - uint64_t current_active_clients_bit_mask = + uint32_t current_active_clients_bit_mask = active_clients_bit_mask_->load(std::memory_order_acquire); - uint64_t consumer_state_mask = + uint32_t consumer_state_mask = BufferHubDefs::FindNextAvailableClientStateMask( current_active_clients_bit_mask | orphaned_consumer_bit_mask_); - if (consumer_state_mask == 0ULL) { + if (consumer_state_mask == 0U) { ALOGE("%s: reached the maximum mumber of consumers per producer: 63.", __FUNCTION__); return ErrorStatus(E2BIG); } - uint64_t updated_active_clients_bit_mask = + uint32_t updated_active_clients_bit_mask = current_active_clients_bit_mask | consumer_state_mask; // Set the updated value only if the current value stays the same as what was // read before. If the comparison succeeds, update the value without @@ -274,15 +274,15 @@ Status<uint64_t> ProducerChannel::CreateConsumerStateMask() { while (!active_clients_bit_mask_->compare_exchange_weak( current_active_clients_bit_mask, updated_active_clients_bit_mask, std::memory_order_acq_rel, std::memory_order_acquire)) { - ALOGE("%s: Current active clients bit mask is changed to %" PRIx64 - ", which was expected to be %" PRIx64 + ALOGE("%s: Current active clients bit mask is changed to %" PRIx32 + ", which was expected to be %" PRIx32 ". Trying to generate a new client state mask to resolve race " "condition.", __FUNCTION__, updated_active_clients_bit_mask, current_active_clients_bit_mask); consumer_state_mask = BufferHubDefs::FindNextAvailableClientStateMask( current_active_clients_bit_mask | orphaned_consumer_bit_mask_); - if (consumer_state_mask == 0ULL) { + if (consumer_state_mask == 0U) { ALOGE("%s: reached the maximum mumber of consumers per producer: %d.", __FUNCTION__, (BufferHubDefs::kMaxNumberOfClients - 1)); return ErrorStatus(E2BIG); @@ -294,7 +294,7 @@ Status<uint64_t> ProducerChannel::CreateConsumerStateMask() { return {consumer_state_mask}; } -void ProducerChannel::RemoveConsumerClientMask(uint64_t consumer_state_mask) { +void ProducerChannel::RemoveConsumerClientMask(uint32_t consumer_state_mask) { // Clear up the buffer state and fence state in case there is already // something there due to possible race condition between producer post and // consumer failed to create channel. @@ -308,7 +308,7 @@ void ProducerChannel::RemoveConsumerClientMask(uint64_t consumer_state_mask) { } Status<RemoteChannelHandle> ProducerChannel::CreateConsumer( - Message& message, uint64_t consumer_state_mask) { + Message& message, uint32_t consumer_state_mask) { ATRACE_NAME(__FUNCTION__); ALOGD_IF(TRACE, "%s: buffer_id=%d", __FUNCTION__, buffer_id()); @@ -332,7 +332,7 @@ Status<RemoteChannelHandle> ProducerChannel::CreateConsumer( return ErrorStatus(ENOMEM); } - uint64_t current_buffer_state = + uint32_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (BufferHubDefs::IsBufferReleased(current_buffer_state) || BufferHubDefs::AnyClientGained(current_buffer_state)) { @@ -343,7 +343,7 @@ Status<RemoteChannelHandle> ProducerChannel::CreateConsumer( bool update_buffer_state = true; if (!BufferHubDefs::IsClientPosted(current_buffer_state, consumer_state_mask)) { - uint64_t updated_buffer_state = + uint32_t updated_buffer_state = current_buffer_state ^ (consumer_state_mask & BufferHubDefs::kHighBitsMask); while (!buffer_state_->compare_exchange_weak( @@ -351,15 +351,15 @@ Status<RemoteChannelHandle> ProducerChannel::CreateConsumer( std::memory_order_acquire)) { ALOGI( "%s: Failed to post to the new consumer. " - "Current buffer state was changed to %" PRIx64 + "Current buffer state was changed to %" PRIx32 " when trying to acquire the buffer and modify the buffer state to " - "%" PRIx64 + "%" PRIx32 ". About to try again if the buffer is still not gained nor fully " "released.", __FUNCTION__, current_buffer_state, updated_buffer_state); if (BufferHubDefs::IsBufferReleased(current_buffer_state) || BufferHubDefs::AnyClientGained(current_buffer_state)) { - ALOGI("%s: buffer is gained or fully released, state=%" PRIx64 ".", + ALOGI("%s: buffer is gained or fully released, state=%" PRIx32 ".", __FUNCTION__, current_buffer_state); update_buffer_state = false; break; @@ -393,7 +393,7 @@ Status<void> ProducerChannel::OnProducerPost(Message&, epoll_event event; event.events = 0; - event.data.u64 = 0ULL; + event.data.u32 = 0U; int ret = epoll_ctl(release_fence_fd_.Get(), EPOLL_CTL_MOD, dummy_fence_fd_.Get(), &event); ALOGE_IF(ret < 0, @@ -401,7 +401,7 @@ Status<void> ProducerChannel::OnProducerPost(Message&, "release fence to include the dummy fence: %s", strerror(errno)); - eventfd_t dummy_fence_count = 0ULL; + eventfd_t dummy_fence_count = 0U; if (eventfd_read(dummy_fence_fd_.Get(), &dummy_fence_count) < 0) { const int error = errno; if (error != EAGAIN) { @@ -451,13 +451,13 @@ Status<LocalFence> ProducerChannel::OnProducerGain(Message& /*message*/) { ALOGD_IF(TRACE, "ProducerChannel::OnProducerDetach: buffer_id=%d", buffer_id()); - uint64_t buffer_state = buffer_state_->load(std::memory_order_acquire); + uint32_t buffer_state = buffer_state_->load(std::memory_order_acquire); if (!BufferHubDefs::IsClientGained( buffer_state, BufferHubDefs::kFirstClientStateMask)) { // Can only detach a BufferProducer when it's in gained state. ALOGW( "ProducerChannel::OnProducerDetach: The buffer (id=%d, state=%" - PRIx64 + PRIx32 ") is not in gained state.", buffer_id(), buffer_state); return {}; @@ -534,7 +534,7 @@ Status<void> ProducerChannel::OnConsumerRelease(Message&, } } - uint64_t current_buffer_state = + uint32_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (BufferHubDefs::IsBufferReleased(current_buffer_state & ~orphaned_consumer_bit_mask_)) { @@ -542,7 +542,7 @@ Status<void> ProducerChannel::OnConsumerRelease(Message&, if (orphaned_consumer_bit_mask_) { ALOGW( "%s: orphaned buffer detected during the this acquire/release cycle: " - "id=%d orphaned=0x%" PRIx64 " queue_index=%" PRIx64 ".", + "id=%d orphaned=0x%" PRIx32 " queue_index=%" PRIx64 ".", __FUNCTION__, buffer_id(), orphaned_consumer_bit_mask_, metadata_header_->queue_index); orphaned_consumer_bit_mask_ = 0; @@ -552,16 +552,16 @@ Status<void> ProducerChannel::OnConsumerRelease(Message&, return {}; } -void ProducerChannel::OnConsumerOrphaned(const uint64_t& consumer_state_mask) { +void ProducerChannel::OnConsumerOrphaned(const uint32_t& consumer_state_mask) { // Remember the ignored consumer so that newly added consumer won't be // taking the same state mask as this orphaned consumer. ALOGE_IF(orphaned_consumer_bit_mask_ & consumer_state_mask, - "%s: Consumer (consumer_state_mask=%" PRIx64 + "%s: Consumer (consumer_state_mask=%" PRIx32 ") is already orphaned.", __FUNCTION__, consumer_state_mask); orphaned_consumer_bit_mask_ |= consumer_state_mask; - uint64_t current_buffer_state = + uint32_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (BufferHubDefs::IsBufferReleased(current_buffer_state & ~orphaned_consumer_bit_mask_)) { @@ -577,8 +577,8 @@ void ProducerChannel::OnConsumerOrphaned(const uint64_t& consumer_state_mask) { ALOGW( "%s: detected new orphaned consumer buffer_id=%d " - "consumer_state_mask=%" PRIx64 " queue_index=%" PRIx64 - " buffer_state=%" PRIx64 " fence_state=%" PRIx64 ".", + "consumer_state_mask=%" PRIx32 " queue_index=%" PRIx64 + " buffer_state=%" PRIx32 " fence_state=%" PRIx32 ".", __FUNCTION__, buffer_id(), consumer_state_mask, metadata_header_->queue_index, buffer_state_->load(std::memory_order_acquire), @@ -594,18 +594,18 @@ void ProducerChannel::RemoveConsumer(ConsumerChannel* channel) { std::find(consumer_channels_.begin(), consumer_channels_.end(), channel)); // Restore the consumer state bit and make it visible in other threads that // acquire the active_clients_bit_mask_. - uint64_t consumer_state_mask = channel->client_state_mask(); - uint64_t current_active_clients_bit_mask = + uint32_t consumer_state_mask = channel->client_state_mask(); + uint32_t current_active_clients_bit_mask = active_clients_bit_mask_->load(std::memory_order_acquire); - uint64_t updated_active_clients_bit_mask = + uint32_t updated_active_clients_bit_mask = current_active_clients_bit_mask & (~consumer_state_mask); while (!active_clients_bit_mask_->compare_exchange_weak( current_active_clients_bit_mask, updated_active_clients_bit_mask, std::memory_order_acq_rel, std::memory_order_acquire)) { ALOGI( "%s: Failed to remove consumer state mask. Current active clients bit " - "mask is changed to %" PRIu64 - " when trying to acquire and modify it to %" PRIu64 + "mask is changed to %" PRIx32 + " when trying to acquire and modify it to %" PRIx32 ". About to try again.", __FUNCTION__, current_active_clients_bit_mask, updated_active_clients_bit_mask); @@ -613,7 +613,7 @@ void ProducerChannel::RemoveConsumer(ConsumerChannel* channel) { current_active_clients_bit_mask & (~consumer_state_mask); } - const uint64_t current_buffer_state = + const uint32_t current_buffer_state = buffer_state_->load(std::memory_order_acquire); if (BufferHubDefs::IsClientPosted(current_buffer_state, consumer_state_mask) || @@ -634,7 +634,7 @@ void ProducerChannel::RemoveConsumer(ConsumerChannel* channel) { if (fence_state_->load(std::memory_order_acquire) & consumer_state_mask) { epoll_event event; event.events = EPOLLIN; - event.data.u64 = consumer_state_mask; + event.data.u32 = consumer_state_mask; if (epoll_ctl(release_fence_fd_.Get(), EPOLL_CTL_MOD, dummy_fence_fd_.Get(), &event) < 0) { ALOGE( |