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

Commit 46adfbc9 authored by Mathias Agopian's avatar Mathias Agopian Committed by Android Git Automerger
Browse files

am ae66946b: Merge "fix a race in SF buffer management" into gingerbread

Merge commit 'ae66946bd9e9f1168241c75196d2379b43e3ca30' into gingerbread-plus-aosp

* commit 'ae66946bd9e9f1168241c75196d2379b43e3ca30':
  fix a race in SF buffer management
parents 2e48f7e4 e5b49780
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -151,7 +151,6 @@ public:
    ~SharedBufferBase();
    status_t getStatus() const;
    int32_t getIdentity() const;
    size_t getFrontBuffer() const;
    String8 dump(char const* prefix) const;

protected:
@@ -226,6 +225,11 @@ private:
        inline ssize_t operator()();
    };

    struct DequeueUpdate : public UpdateBase {
        inline DequeueUpdate(SharedBufferBase* sbb);
        inline ssize_t operator()();
    };

    struct UndoDequeueUpdate : public UpdateBase {
        inline UndoDequeueUpdate(SharedBufferBase* sbb);
        inline ssize_t operator()();
+12 −12
Original line number Diff line number Diff line
@@ -191,12 +191,6 @@ int32_t SharedBufferBase::getIdentity() const
    return stack.identity;
}

size_t SharedBufferBase::getFrontBuffer() const
{
    SharedBufferStack& stack( *mSharedStack );
    return size_t( stack.head );
}

String8 SharedBufferBase::dump(char const* prefix) const
{
    const size_t SIZE = 1024;
@@ -281,6 +275,16 @@ ssize_t SharedBufferClient::QueueUpdate::operator()() {
    return NO_ERROR;
}

SharedBufferClient::DequeueUpdate::DequeueUpdate(SharedBufferBase* sbb)
    : UpdateBase(sbb) {
}
ssize_t SharedBufferClient::DequeueUpdate::operator()() {
    if (android_atomic_dec(&stack.available) == 0) {
        LOGW("dequeue probably called from multiple threads!");
    }
    return NO_ERROR;
}

SharedBufferClient::UndoDequeueUpdate::UndoDequeueUpdate(SharedBufferBase* sbb)
    : UpdateBase(sbb) {    
}
@@ -388,12 +392,8 @@ ssize_t SharedBufferClient::dequeue()
    if (err != NO_ERROR)
        return ssize_t(err);

    // NOTE: 'stack.available' is part of the conditions, however
    // decrementing it, never changes any conditions, so we don't need
    // to do this as part of an update.
    if (android_atomic_dec(&stack.available) == 0) {
        LOGW("dequeue probably called from multiple threads!");
    }
    DequeueUpdate update(this);
    updateCondition( update );

    undoDequeueTail = tail;
    int dequeued = stack.index[tail];