summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2013-08-30 01:48:14 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-08-30 01:48:14 +0000
commit96be8bb7c2ce0fc6d3c62f3467e752ddf87c7f44 (patch)
tree96e2c5ea90f2b9d4bad649f327339b848d4950da
parent51ec03c203b902edbea538b9b5ef862dea749099 (diff)
parent26fe6c7c56477ef227205c68f17df07ca3501d65 (diff)
downloadframeworks_av-96be8bb7c2ce0fc6d3c62f3467e752ddf87c7f44.zip
frameworks_av-96be8bb7c2ce0fc6d3c62f3467e752ddf87c7f44.tar.gz
frameworks_av-96be8bb7c2ce0fc6d3c62f3467e752ddf87c7f44.tar.bz2
Merge "Camera3: Be busy as soon as work arrives." into klp-dev
-rw-r--r--services/camera/libcameraservice/device3/Camera3Device.cpp19
-rw-r--r--services/camera/libcameraservice/device3/Camera3Device.h1
2 files changed, 19 insertions, 1 deletions
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 7f2ec7a..47321e0 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -1424,6 +1424,8 @@ status_t Camera3Device::RequestThread::queueRequest(
Mutex::Autolock l(mRequestLock);
mRequestQueue.push_back(request);
+ unpauseForNewRequests();
+
return OK;
}
@@ -1489,6 +1491,9 @@ status_t Camera3Device::RequestThread::setRepeatingRequests(
mRepeatingRequests.clear();
mRepeatingRequests.insert(mRepeatingRequests.begin(),
requests.begin(), requests.end());
+
+ unpauseForNewRequests();
+
return OK;
}
@@ -1791,7 +1796,9 @@ sp<Camera3Device::CaptureRequest>
mRequestQueue.erase(firstRequest);
}
- // Not paused
+ // In case we've been unpaused by setPaused clearing mDoPause, need to
+ // update internal pause state (capture/setRepeatingRequest unpause
+ // directly).
Mutex::Autolock pl(mPauseLock);
mPaused = false;
@@ -1824,6 +1831,16 @@ bool Camera3Device::RequestThread::waitIfPaused() {
return false;
}
+void Camera3Device::RequestThread::unpauseForNewRequests() {
+ // With work to do, mark thread as unpaused.
+ // If paused by request (setPaused), don't resume, to avoid
+ // extra signaling/waiting overhead to waitUntilPaused
+ Mutex::Autolock p(mPauseLock);
+ if (!mDoPause) {
+ mPaused = false;
+ }
+}
+
void Camera3Device::RequestThread::setErrorState(const char *fmt, ...) {
sp<Camera3Device> parent = mParent.promote();
if (parent != NULL) {
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index 99e1cc8..6565048 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -314,6 +314,7 @@ class Camera3Device :
// Pause handling
bool waitIfPaused();
+ void unpauseForNewRequests();
// Relay error to parent device object setErrorState
void setErrorState(const char *fmt, ...);