diff options
author | Mathias Agopian <mathias@google.com> | 2009-09-10 16:55:13 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2009-09-10 16:55:13 -0700 |
commit | 436c627ca4228284caf363f0cb35947e58b841b9 (patch) | |
tree | 6743fc56b723aef0c09f2d09279581e862472973 | |
parent | bcbcaa7edd32ba67c6290d79f7e7821c4b5b39ac (diff) | |
download | frameworks_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.h | 16 | ||||
-rw-r--r-- | libs/ui/SharedBufferStack.cpp | 18 |
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 ); |