Merge change 24947 into eclair

* changes:
  make sure to update the tail pointer when undoing a dequeue
This commit is contained in:
Android (Google) Code Review
2009-09-14 19:01:40 -04:00
2 changed files with 17 additions and 5 deletions

View File

@@ -228,6 +228,8 @@ private:
friend struct Condition; friend struct Condition;
friend struct DequeueCondition; friend struct DequeueCondition;
friend struct LockCondition; friend struct LockCondition;
int32_t computeTail() const;
struct QueueUpdate : public UpdateBase { struct QueueUpdate : public UpdateBase {
inline QueueUpdate(SharedBufferBase* sbb); inline QueueUpdate(SharedBufferBase* sbb);

View File

@@ -245,20 +245,27 @@ ssize_t SharedBufferServer::StatusUpdate::operator()() {
SharedBufferClient::SharedBufferClient(SharedClient* sharedClient, SharedBufferClient::SharedBufferClient(SharedClient* sharedClient,
int surface, int num) int surface, int num)
: SharedBufferBase(sharedClient, surface, num), tail(0) : SharedBufferBase(sharedClient, surface, num), tail(0)
{
tail = computeTail();
}
int32_t SharedBufferClient::computeTail() const
{ {
SharedBufferStack& stack( *mSharedStack ); SharedBufferStack& stack( *mSharedStack );
int32_t avail;
int32_t head;
// we need to make sure we read available and head coherently, // we need to make sure we read available and head coherently,
// w.r.t RetireUpdate. // w.r.t RetireUpdate.
int32_t newTail;
int32_t avail;
int32_t head;
do { do {
avail = stack.available; avail = stack.available;
head = stack.head; head = stack.head;
} while (stack.available != avail); } while (stack.available != avail);
tail = head - avail + 1; newTail = head - avail + 1;
if (tail < 0) { if (newTail < 0) {
tail += num; newTail += mNumBuffers;
} }
return newTail;
} }
ssize_t SharedBufferClient::dequeue() ssize_t SharedBufferClient::dequeue()
@@ -296,6 +303,9 @@ status_t SharedBufferClient::undoDequeue(int buf)
{ {
UndoDequeueUpdate update(this); UndoDequeueUpdate update(this);
status_t err = updateCondition( update ); status_t err = updateCondition( update );
if (err == NO_ERROR) {
tail = computeTail();
}
return err; return err;
} }