diff --git a/include/private/ui/SharedBufferStack.h b/include/private/ui/SharedBufferStack.h index 6181f5576..8b0f154f5 100644 --- a/include/private/ui/SharedBufferStack.h +++ b/include/private/ui/SharedBufferStack.h @@ -228,6 +228,8 @@ private: friend struct Condition; friend struct DequeueCondition; friend struct LockCondition; + + int32_t computeTail() const; struct QueueUpdate : public UpdateBase { inline QueueUpdate(SharedBufferBase* sbb); diff --git a/libs/ui/SharedBufferStack.cpp b/libs/ui/SharedBufferStack.cpp index 436d79320..7789a3f86 100644 --- a/libs/ui/SharedBufferStack.cpp +++ b/libs/ui/SharedBufferStack.cpp @@ -245,20 +245,27 @@ ssize_t SharedBufferServer::StatusUpdate::operator()() { SharedBufferClient::SharedBufferClient(SharedClient* sharedClient, int surface, int num) : SharedBufferBase(sharedClient, surface, num), tail(0) +{ + tail = computeTail(); +} + +int32_t SharedBufferClient::computeTail() const { SharedBufferStack& stack( *mSharedStack ); - int32_t avail; - int32_t head; // we need to make sure we read available and head coherently, // w.r.t RetireUpdate. + int32_t newTail; + int32_t avail; + int32_t head; do { avail = stack.available; head = stack.head; } while (stack.available != avail); - tail = head - avail + 1; - if (tail < 0) { - tail += num; + newTail = head - avail + 1; + if (newTail < 0) { + newTail += mNumBuffers; } + return newTail; } ssize_t SharedBufferClient::dequeue() @@ -296,6 +303,9 @@ status_t SharedBufferClient::undoDequeue(int buf) { UndoDequeueUpdate update(this); status_t err = updateCondition( update ); + if (err == NO_ERROR) { + tail = computeTail(); + } return err; }