summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tianyu Jiang <tianyuj@google.com> 2018-12-17 12:58:34 -0800
committer Tianyu Jiang <tianyuj@google.com> 2018-12-17 12:58:34 -0800
commit2ceb320ea35a14ef8f6df460314f85a40a7581de (patch)
tree8fbc201e92640ad93fc8617a93c6214de54f6d90
parent49c55bb850f814cd7032ca815201a597a74cca40 (diff)
Check atomics in shared memory are lock free
when they are created in bufferhub server side in BufferNode, and client side in BufferHubBuffer. Fix: 117849512 Test: BufferHub_test BufferHubServer_test Change-Id: Ifc5b681a6a86fa02cb598b33bf68dfefc07a76f9
-rw-r--r--libs/ui/BufferHubBuffer.cpp7
-rw-r--r--services/bufferhub/BufferNode.cpp8
2 files changed, 15 insertions, 0 deletions
diff --git a/libs/ui/BufferHubBuffer.cpp b/libs/ui/BufferHubBuffer.cpp
index 226b6ee9ad..0582e1afe7 100644
--- a/libs/ui/BufferHubBuffer.cpp
+++ b/libs/ui/BufferHubBuffer.cpp
@@ -169,6 +169,13 @@ int BufferHubBuffer::ImportGraphicBuffer() {
buffer_state_ = &metadata_header->buffer_state;
fence_state_ = &metadata_header->fence_state;
active_clients_bit_mask_ = &metadata_header->active_clients_bit_mask;
+ // The C++ standard recommends (but does not require) that lock-free atomic operations are
+ // also address-free, that is, suitable for communication between processes using shared
+ // memory.
+ LOG_ALWAYS_FATAL_IF(!std::atomic_is_lock_free(buffer_state_) ||
+ !std::atomic_is_lock_free(fence_state_) ||
+ !std::atomic_is_lock_free(active_clients_bit_mask_),
+ "Atomic variables in ashmen are not lock free.");
// Import the buffer: We only need to hold on the native_handle_t here so that
// GraphicBuffer instance can be created in future.
diff --git a/services/bufferhub/BufferNode.cpp b/services/bufferhub/BufferNode.cpp
index cc87e15917..da19a6fb1d 100644
--- a/services/bufferhub/BufferNode.cpp
+++ b/services/bufferhub/BufferNode.cpp
@@ -2,6 +2,7 @@
#include <bufferhub/BufferHubService.h>
#include <bufferhub/BufferNode.h>
+#include <log/log.h>
#include <ui/GraphicBufferAllocator.h>
namespace android {
@@ -18,6 +19,13 @@ void BufferNode::InitializeMetadata() {
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<uint32_t>(0);
+ // The C++ standard recommends (but does not require) that lock-free atomic operations are
+ // also address-free, that is, suitable for communication between processes using shared
+ // memory.
+ LOG_ALWAYS_FATAL_IF(!std::atomic_is_lock_free(buffer_state_) ||
+ !std::atomic_is_lock_free(fence_state_) ||
+ !std::atomic_is_lock_free(active_clients_bit_mask_),
+ "Atomic variables in ashmen are not lock free.");
}
// Allocates a new BufferNode.