summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShuzhen Wang <shuzhenwang@google.com>2016-09-23 23:03:48 +0000
committerandroid-build-merger <android-build-merger@google.com>2016-09-23 23:03:48 +0000
commit03251ed1c3ba9399e772ca04adf854685287d237 (patch)
treecd03e0e095dac35f2890cc6049f4d958136e9360
parentb5eb2f1d10a9b1e6934ef4eb653486690d241651 (diff)
parent5b3d4063f6edb7fb674daded9c116980b9d1d6e6 (diff)
downloadshamu-03251ed1c3ba9399e772ca04adf854685287d237.tar.gz
QCamera2: stack: Time out if wait_for_event takes too long
am: 5b3d4063f6 Change-Id: I2dbb41b892e6fdc462242eb456de135556136ee9
-rw-r--r--camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h2
-rw-r--r--camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c19
2 files changed, 19 insertions, 2 deletions
diff --git a/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h b/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h
index a343c33c..187ad4d2 100644
--- a/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h
+++ b/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h
@@ -48,6 +48,8 @@
#define MM_CAMERA_DEV_OPEN_TRIES 20
#define MM_CAMERA_DEV_OPEN_RETRY_SLEEP 20
+#define WAIT_TIMEOUT_IN_SEC 5
+
#ifndef TRUE
#define TRUE 1
#endif
diff --git a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c
index 93eb5d1a..218a554e 100644
--- a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c
+++ b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c
@@ -1576,11 +1576,26 @@ void mm_camera_util_wait_for_event(mm_camera_obj_t *my_obj,
uint32_t evt_mask,
int32_t *status)
{
+ int32_t rc = 0;
+ struct timespec ts;
+
pthread_mutex_lock(&my_obj->evt_lock);
while (!(my_obj->evt_rcvd.server_event_type & evt_mask)) {
- pthread_cond_wait(&my_obj->evt_cond, &my_obj->evt_lock);
+ clock_gettime(CLOCK_REALTIME, &ts);
+ ts.tv_sec += WAIT_TIMEOUT_IN_SEC;
+ rc = pthread_cond_timedwait(&my_obj->evt_cond, &my_obj->evt_lock, &ts);
+ if (rc) {
+ ALOGE("%s: pthread_cond_timedwait of evt_mask 0x%x fails %d",
+ __func__, evt_mask, rc);
+ break;
+ }
}
- *status = my_obj->evt_rcvd.status;
+ if (!rc) {
+ *status = my_obj->evt_rcvd.status;
+ } else {
+ *status = MSM_CAMERA_STATUS_FAIL;
+ }
+
/* reset local storage for recieved event for next event */
memset(&my_obj->evt_rcvd, 0, sizeof(mm_camera_event_t));
pthread_mutex_unlock(&my_obj->evt_lock);