summaryrefslogtreecommitdiffstats
path: root/libs/ui
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2009-09-14 15:48:42 -0700
committerMathias Agopian <mathias@google.com>2009-09-14 15:48:42 -0700
commitbd8527110caa5427ade0edd7ce0d00e63f15ccbc (patch)
treeb3f278132e4c3e9b78cfdfa48a97bf84f26e5d98 /libs/ui
parentdf5e76f9c635a84efa16c5e2f6cf516b4b8fe300 (diff)
downloadframeworks_base-bd8527110caa5427ade0edd7ce0d00e63f15ccbc.zip
frameworks_base-bd8527110caa5427ade0edd7ce0d00e63f15ccbc.tar.gz
frameworks_base-bd8527110caa5427ade0edd7ce0d00e63f15ccbc.tar.bz2
make sure to update the tail pointer when undoing a dequeue
Diffstat (limited to 'libs/ui')
-rw-r--r--libs/ui/SharedBufferStack.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/libs/ui/SharedBufferStack.cpp b/libs/ui/SharedBufferStack.cpp
index 436d793..7789a3f 100644
--- a/libs/ui/SharedBufferStack.cpp
+++ b/libs/ui/SharedBufferStack.cpp
@@ -246,19 +246,26 @@ 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;
}