diff options
author | Shuzhen Wang <shuzhenwang@google.com> | 2016-09-23 23:03:48 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-09-23 23:03:48 +0000 |
commit | 03251ed1c3ba9399e772ca04adf854685287d237 (patch) | |
tree | cd03e0e095dac35f2890cc6049f4d958136e9360 | |
parent | b5eb2f1d10a9b1e6934ef4eb653486690d241651 (diff) | |
parent | 5b3d4063f6edb7fb674daded9c116980b9d1d6e6 (diff) | |
download | shamu-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.h | 2 | ||||
-rw-r--r-- | camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c | 19 |
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); |