summaryrefslogtreecommitdiffstats
path: root/libs/ui
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2009-09-11 19:18:20 -0700
committerMathias Agopian <mathias@google.com>2009-09-11 19:18:20 -0700
commit3e63f9173a9d60d83c24b6412fe7dd0c42896797 (patch)
treed55402a3194c9200aef0529800ba78110db71555 /libs/ui
parent32d8571f509c392dca732c243e9b2138c15daecf (diff)
downloadframeworks_base-3e63f9173a9d60d83c24b6412fe7dd0c42896797.zip
frameworks_base-3e63f9173a9d60d83c24b6412fe7dd0c42896797.tar.gz
frameworks_base-3e63f9173a9d60d83c24b6412fe7dd0c42896797.tar.bz2
fix [2111536] [FAST BLOCKER] Device is soft rebooted after ending the call through voice dialer
Diffstat (limited to 'libs/ui')
-rw-r--r--libs/ui/SharedBufferStack.cpp25
1 files changed, 22 insertions, 3 deletions
diff --git a/libs/ui/SharedBufferStack.cpp b/libs/ui/SharedBufferStack.cpp
index 3fbd8c7..436d793 100644
--- a/libs/ui/SharedBufferStack.cpp
+++ b/libs/ui/SharedBufferStack.cpp
@@ -246,10 +246,30 @@ SharedBufferClient::SharedBufferClient(SharedClient* sharedClient,
int surface, int num)
: SharedBufferBase(sharedClient, surface, num), tail(0)
{
+ SharedBufferStack& stack( *mSharedStack );
+ int32_t avail;
+ int32_t head;
+ // we need to make sure we read available and head coherently,
+ // w.r.t RetireUpdate.
+ do {
+ avail = stack.available;
+ head = stack.head;
+ } while (stack.available != avail);
+ tail = head - avail + 1;
+ if (tail < 0) {
+ tail += num;
+ }
}
ssize_t SharedBufferClient::dequeue()
{
+ SharedBufferStack& stack( *mSharedStack );
+
+ if (stack.head == tail && stack.available == 2) {
+ LOGW("dequeue: tail=%d, head=%d, avail=%d, queued=%d",
+ tail, stack.head, stack.available, stack.queued);
+ }
+
//LOGD("[%d] about to dequeue a buffer",
// mSharedStack->identity);
DequeueCondition condition(this);
@@ -257,8 +277,6 @@ ssize_t SharedBufferClient::dequeue()
if (err != NO_ERROR)
return ssize_t(err);
-
- SharedBufferStack& stack( *mSharedStack );
// 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.
@@ -270,6 +288,7 @@ ssize_t SharedBufferClient::dequeue()
tail = ((tail+1 >= mNumBuffers) ? 0 : tail+1);
LOGD_IF(DEBUG_ATOMICS, "dequeued=%d, tail=%d, %s",
dequeued, tail, dump("").string());
+
return dequeued;
}
@@ -326,7 +345,7 @@ ssize_t SharedBufferServer::retireAndLock()
{
RetireUpdate update(this, mNumBuffers);
ssize_t buf = updateCondition( update );
- LOGD_IF(DEBUG_ATOMICS, "retire=%d, %s", int(buf), dump("").string());
+ LOGD_IF(DEBUG_ATOMICS && buf>=0, "retire=%d, %s", int(buf), dump("").string());
return buf;
}