summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2010-01-22 11:47:55 -0800
committerMathias Agopian <mathias@google.com>2010-01-22 11:47:55 -0800
commit116e541eacde53f8c83e1136229d8653bad6bf61 (patch)
treeecd8217237bb75f16857bc206efc89161cffde0c /libs
parent2d41cb9433ef3845560a252a5cf8226e1d78209a (diff)
downloadframeworks_base-116e541eacde53f8c83e1136229d8653bad6bf61.zip
frameworks_base-116e541eacde53f8c83e1136229d8653bad6bf61.tar.gz
frameworks_base-116e541eacde53f8c83e1136229d8653bad6bf61.tar.bz2
return an error when Surface::lock() is called while the surface is already locked.
Diffstat (limited to 'libs')
-rw-r--r--libs/ui/Surface.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/libs/ui/Surface.cpp b/libs/ui/Surface.cpp
index 24ae27f..c7be05b 100644
--- a/libs/ui/Surface.cpp
+++ b/libs/ui/Surface.cpp
@@ -607,13 +607,21 @@ status_t Surface::lock(SurfaceInfo* info, bool blocking) {
status_t Surface::lock(SurfaceInfo* other, Region* dirtyIn, bool blocking)
{
if (mApiLock.tryLock() != NO_ERROR) {
- LOGE("calling Surface::lock() from different threads!");
+ LOGE("calling Surface::lock from different threads!");
CallStack stack;
stack.update();
stack.dump("Surface::lock called from different threads");
return WOULD_BLOCK;
}
+
+ /* Here we're holding mApiLock */
+ if (mLockedBuffer != 0) {
+ LOGE("Surface::lock failed, already locked");
+ mApiLock.unlock();
+ return INVALID_OPERATION;
+ }
+
// we're intending to do software rendering from this point
setUsage(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
@@ -682,8 +690,8 @@ status_t Surface::lock(SurfaceInfo* other, Region* dirtyIn, bool blocking)
status_t Surface::unlockAndPost()
{
if (mLockedBuffer == 0) {
- LOGE("unlockAndPost failed, no locked buffer");
- return BAD_VALUE;
+ LOGE("Surface::unlockAndPost failed, no locked buffer");
+ return INVALID_OPERATION;
}
status_t err = mLockedBuffer->unlock();