summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2009-09-10 16:55:13 -0700
committerMathias Agopian <mathias@google.com>2009-09-10 16:55:13 -0700
commit436c627ca4228284caf363f0cb35947e58b841b9 (patch)
tree6743fc56b723aef0c09f2d09279581e862472973
parentbcbcaa7edd32ba67c6290d79f7e7821c4b5b39ac (diff)
downloadframeworks_base-436c627ca4228284caf363f0cb35947e58b841b9.zip
frameworks_base-436c627ca4228284caf363f0cb35947e58b841b9.tar.gz
frameworks_base-436c627ca4228284caf363f0cb35947e58b841b9.tar.bz2
make sure conditions will return when the status of a surface is not NO_ERROR
-rw-r--r--include/private/ui/SharedBufferStack.h16
-rw-r--r--libs/ui/SharedBufferStack.cpp18
2 files changed, 29 insertions, 5 deletions
diff --git a/include/private/ui/SharedBufferStack.h b/include/private/ui/SharedBufferStack.h
index 2bd5344..e56b8b2 100644
--- a/include/private/ui/SharedBufferStack.h
+++ b/include/private/ui/SharedBufferStack.h
@@ -93,12 +93,12 @@ public:
volatile int32_t available; // number of dequeue-able buffers
volatile int32_t queued; // number of buffers waiting for post
volatile int32_t inUse; // buffer currently in use by SF
+ volatile status_t status; // surface's status code
// not part of the conditions
volatile int32_t reallocMask;
int32_t identity; // surface's identity (const)
- status_t status; // surface's status code
int32_t reserved32[13];
FlatRegion dirtyRegion[NUM_BUFFER_MAX]; // 12*4=48 bytes
};
@@ -168,10 +168,11 @@ protected:
template <typename T>
status_t SharedBufferBase::waitForCondition(T condition)
{
+ const SharedBufferStack& stack( *mSharedStack );
SharedClient& client( *mSharedClient );
const nsecs_t TIMEOUT = s2ns(1);
Mutex::Autolock _l(client.lock);
- while (!condition()) {
+ while ((condition()==false) && (stack.status == NO_ERROR)) {
status_t err = client.cv.waitRelative(client.lock, TIMEOUT);
// handle errors and timeouts
@@ -195,7 +196,7 @@ status_t SharedBufferBase::waitForCondition(T condition)
}
}
}
- return NO_ERROR;
+ return stack.status;
}
@@ -265,9 +266,10 @@ public:
ssize_t retireAndLock();
status_t unlock(int buffer);
+ void setStatus(status_t status);
status_t reallocate();
status_t assertReallocate(int buffer);
-
+
Region getDirtyRegion(int buffer) const;
private:
@@ -283,6 +285,12 @@ private:
inline ssize_t operator()();
};
+ struct StatusUpdate : public UpdateBase {
+ const status_t status;
+ inline StatusUpdate(SharedBufferBase* sbb, status_t status);
+ inline ssize_t operator()();
+ };
+
struct ReallocateCondition : public ConditionBase {
int buf;
inline ReallocateCondition(SharedBufferBase* sbb, int buf);
diff --git a/libs/ui/SharedBufferStack.cpp b/libs/ui/SharedBufferStack.cpp
index 5995af5..73fb582 100644
--- a/libs/ui/SharedBufferStack.cpp
+++ b/libs/ui/SharedBufferStack.cpp
@@ -64,7 +64,7 @@ status_t SharedClient::setIdentity(size_t token, uint32_t identity) {
SharedBufferStack::SharedBufferStack()
- : inUse(-1), identity(-1), status(NO_ERROR)
+ : inUse(-1), status(NO_ERROR), identity(-1)
{
}
@@ -231,6 +231,16 @@ ssize_t SharedBufferServer::RetireUpdate::operator()() {
return head;
}
+SharedBufferServer::StatusUpdate::StatusUpdate(
+ SharedBufferBase* sbb, status_t status)
+ : UpdateBase(sbb), status(status) {
+}
+
+ssize_t SharedBufferServer::StatusUpdate::operator()() {
+ android_atomic_write(status, &stack.status);
+ return NO_ERROR;
+}
+
// ============================================================================
SharedBufferClient::SharedBufferClient(SharedClient* sharedClient,
@@ -327,6 +337,12 @@ status_t SharedBufferServer::unlock(int buffer)
return err;
}
+void SharedBufferServer::setStatus(status_t status)
+{
+ StatusUpdate update(this, status);
+ updateCondition( update );
+}
+
status_t SharedBufferServer::reallocate()
{
SharedBufferStack& stack( *mSharedStack );