QCamera2: stack: Time out if wait_for_event takes too long
Use pthread_cond_timedwait in wait_for_event so that it won't block
forever.
Bug: 29754297
Change-Id: I56d46194f1340ae10b04f1b7b39fe30cf61865e1
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 a343c33..187ad4d 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 93eb5d1..218a554 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 @@
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);