Loading services/audioflinger/StateQueue.cpp +5 −11 Original line number Diff line number Diff line Loading @@ -41,13 +41,14 @@ void StateQueueMutatorDump::dump(int fd) // Constructor and destructor template<typename T> StateQueue<T>::StateQueue() : mNext(NULL), mAck(NULL), mCurrent(NULL), mAck(NULL), mCurrent(NULL), mMutating(&mStates[0]), mExpecting(NULL), mInMutation(false), mIsDirty(false), mIsInitialized(false) #ifdef STATE_QUEUE_DUMP , mObserverDump(&mObserverDummyDump), mMutatorDump(&mMutatorDummyDump) #endif { atomic_init(&mNext, 0); } template<typename T> StateQueue<T>::~StateQueue() Loading @@ -58,11 +59,8 @@ template<typename T> StateQueue<T>::~StateQueue() template<typename T> const T* StateQueue<T>::poll() { #ifdef __LP64__ const T *next = (const T *) android_atomic_acquire_load64((volatile int64_t *) &mNext); #else const T *next = (const T *) android_atomic_acquire_load((volatile int32_t *) &mNext); #endif const T *next = (const T *) atomic_load_explicit(&mNext, memory_order_acquire); if (next != mCurrent) { mAck = next; // no additional barrier needed mCurrent = next; Loading Loading @@ -144,11 +142,7 @@ template<typename T> bool StateQueue<T>::push(StateQueue<T>::block_t block) } // publish #ifdef __LP64__ android_atomic_release_store64((int64_t) mMutating, (volatile int64_t *) &mNext); #else android_atomic_release_store((int32_t) mMutating, (volatile int32_t *) &mNext); #endif atomic_store_explicit(&mNext, (uintptr_t)mMutating, memory_order_release); mExpecting = mMutating; // copy with circular wraparound Loading services/audioflinger/StateQueue.h +3 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #ifndef ANDROID_AUDIO_STATE_QUEUE_H #define ANDROID_AUDIO_STATE_QUEUE_H #include <stdatomic.h> // The state queue template class was originally driven by this use case / requirements: // There are two threads: a fast mixer, and a normal mixer, and they share state. // The interesting part of the shared state is a set of active fast tracks, Loading Loading @@ -184,7 +186,7 @@ private: T mStates[kN]; // written by mutator, read by observer // "volatile" is meaningless with SMP, but here it indicates that we're using atomic ops volatile const T* mNext; // written by mutator to advance next, read by observer atomic_uintptr_t mNext; // written by mutator to advance next, read by observer volatile const T* mAck; // written by observer to acknowledge advance of next, read by mutator // only used by observer Loading Loading
services/audioflinger/StateQueue.cpp +5 −11 Original line number Diff line number Diff line Loading @@ -41,13 +41,14 @@ void StateQueueMutatorDump::dump(int fd) // Constructor and destructor template<typename T> StateQueue<T>::StateQueue() : mNext(NULL), mAck(NULL), mCurrent(NULL), mAck(NULL), mCurrent(NULL), mMutating(&mStates[0]), mExpecting(NULL), mInMutation(false), mIsDirty(false), mIsInitialized(false) #ifdef STATE_QUEUE_DUMP , mObserverDump(&mObserverDummyDump), mMutatorDump(&mMutatorDummyDump) #endif { atomic_init(&mNext, 0); } template<typename T> StateQueue<T>::~StateQueue() Loading @@ -58,11 +59,8 @@ template<typename T> StateQueue<T>::~StateQueue() template<typename T> const T* StateQueue<T>::poll() { #ifdef __LP64__ const T *next = (const T *) android_atomic_acquire_load64((volatile int64_t *) &mNext); #else const T *next = (const T *) android_atomic_acquire_load((volatile int32_t *) &mNext); #endif const T *next = (const T *) atomic_load_explicit(&mNext, memory_order_acquire); if (next != mCurrent) { mAck = next; // no additional barrier needed mCurrent = next; Loading Loading @@ -144,11 +142,7 @@ template<typename T> bool StateQueue<T>::push(StateQueue<T>::block_t block) } // publish #ifdef __LP64__ android_atomic_release_store64((int64_t) mMutating, (volatile int64_t *) &mNext); #else android_atomic_release_store((int32_t) mMutating, (volatile int32_t *) &mNext); #endif atomic_store_explicit(&mNext, (uintptr_t)mMutating, memory_order_release); mExpecting = mMutating; // copy with circular wraparound Loading
services/audioflinger/StateQueue.h +3 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #ifndef ANDROID_AUDIO_STATE_QUEUE_H #define ANDROID_AUDIO_STATE_QUEUE_H #include <stdatomic.h> // The state queue template class was originally driven by this use case / requirements: // There are two threads: a fast mixer, and a normal mixer, and they share state. // The interesting part of the shared state is a set of active fast tracks, Loading Loading @@ -184,7 +186,7 @@ private: T mStates[kN]; // written by mutator, read by observer // "volatile" is meaningless with SMP, but here it indicates that we're using atomic ops volatile const T* mNext; // written by mutator to advance next, read by observer atomic_uintptr_t mNext; // written by mutator to advance next, read by observer volatile const T* mAck; // written by observer to acknowledge advance of next, read by mutator // only used by observer Loading