Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3879792f authored by Hans Boehm's avatar Hans Boehm Committed by Gerrit Code Review
Browse files

Merge "Remove 64-bit android_atomic uses from StateQueue."

parents 7878f087 f39b5609
Loading
Loading
Loading
Loading
+5 −11
Original line number Diff line number Diff line
@@ -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()
@@ -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;
@@ -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
+3 −1
Original line number Diff line number Diff line
@@ -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,
@@ -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