Camera3: Add poll fd in QBUF as asynchronous call
Without this change, there is deadlock when both Data_notify and
Qbuf are coming at same time i.e, data_notify is waiting for buf_lock
mutex which acquired by qbuf and qbuf-> Add poll fd is waiting for
data_notify to finish.
Adding Poll fd in asynchronous way i.e, POLL FD need not to wait for
data_notify cb's to finish.
Bug: 10998587
Change-Id: I574b25378639f5bc10b753af06b6d729261ee11d
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 6d80db7..034aab8 100644
--- a/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h
+++ b/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h
@@ -561,7 +561,8 @@
uint32_t handler,
int32_t fd,
mm_camera_poll_notify_t nofity_cb,
- void *userdata);
+ void *userdata,
+ mm_camera_call_type_t);
extern int32_t mm_camera_poll_thread_del_poll_fd(
mm_camera_poll_thread_t * poll_cb,
uint32_t handler,
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 07b918e..60c5f78 100644
--- a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c
+++ b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c
@@ -1448,7 +1448,8 @@
my_obj->my_hdl,
my_obj->ctrl_fd,
mm_camera_event_notify,
- (void*)my_obj);
+ (void*)my_obj,
+ mm_camera_sync_call);
}
return rc;
}
diff --git a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
index cd87fae..89e0c48 100644
--- a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
+++ b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
@@ -1167,7 +1167,8 @@
my_obj->my_hdl,
my_obj->fd,
mm_stream_data_notify,
- (void*)my_obj);
+ (void*)my_obj,
+ mm_camera_async_call);
CDBG_HIGH("%s: Started poll on stream %p type :%d", __func__, my_obj,my_obj->stream_info->stream_type);
if (rc < 0) {
ALOGE("%s: add poll fd error", __func__);
diff --git a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c
index 1f65ecb..074af3b 100644
--- a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c
+++ b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c
@@ -370,6 +370,7 @@
* @fd : file descriptor need to be added into polling thread
* @notify_cb : callback function to handle if any notify from fd
* @userdata : user data ptr
+ * @call_type : Whether its Synchronous or Asynchronous call
*
* RETURN : none
*==========================================================================*/
@@ -377,7 +378,8 @@
uint32_t handler,
int32_t fd,
mm_camera_poll_notify_t notify_cb,
- void* userdata)
+ void* userdata,
+ mm_camera_call_type_t call_type)
{
int32_t rc = -1;
uint8_t idx = 0;
@@ -396,7 +398,11 @@
poll_cb->poll_entries[idx].notify_cb = notify_cb;
poll_cb->poll_entries[idx].user_data = userdata;
/* send poll entries updated signal to poll thread */
- rc = mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED);
+ if (call_type == mm_camera_sync_call ) {
+ rc = mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED);
+ } else {
+ rc = mm_camera_poll_sig_async(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED_ASYNC );
+ }
} else {
CDBG_ERROR("%s: invalid handler %d (%d)",
__func__, handler, idx);