Camera2: Implement semaphore with mutex and condition.
POSIX semaphore is not used or well tested on Android.
Implement it using mutex and conditional variable instead.
Change-Id: I480aa69a682821674aa95ff58f40a3b90a8714bc
diff --git a/QCamera2/HAL/QCamera2HWI.cpp b/QCamera2/HAL/QCamera2HWI.cpp
index f1f8cd7..3269c77 100644
--- a/QCamera2/HAL/QCamera2HWI.cpp
+++ b/QCamera2/HAL/QCamera2HWI.cpp
@@ -1345,9 +1345,9 @@
ALOGD("%s: E", __func__);
do {
do {
- ret = sem_wait(&cmdThread->cmd_sem);
+ ret = cam_sem_wait(&cmdThread->cmd_sem);
if (ret != 0 && errno != EINVAL) {
- ALOGE("%s: sem_wait error (%s)",
+ ALOGE("%s: cam_sem_wait error (%s)",
__func__, strerror(errno));
return NULL;
}
diff --git a/QCamera2/HAL/QCameraCmdThread.cpp b/QCamera2/HAL/QCameraCmdThread.cpp
index 83fbc50..f1b1578 100644
--- a/QCamera2/HAL/QCameraCmdThread.cpp
+++ b/QCamera2/HAL/QCameraCmdThread.cpp
@@ -46,8 +46,8 @@
cmd_queue()
{
cmd_pid = 0;
- sem_init(&sync_sem, 0, 0);
- sem_init(&cmd_sem, 0, 0);
+ cam_sem_init(&sync_sem, 0);
+ cam_sem_init(&cmd_sem, 0);
}
/*===========================================================================
@@ -61,8 +61,8 @@
*==========================================================================*/
QCameraCmdThread::~QCameraCmdThread()
{
- sem_destroy(&sync_sem);
- sem_destroy(&cmd_sem);
+ cam_sem_destroy(&sync_sem);
+ cam_sem_destroy(&cmd_sem);
}
/*===========================================================================
@@ -121,11 +121,11 @@
} else {
cmd_queue.enqueue((void *)node);
}
- sem_post(&cmd_sem);
+ cam_sem_post(&cmd_sem);
/* if is a sync call, need to wait until it returns */
if (sync_cmd) {
- sem_wait(&sync_sem);
+ cam_sem_wait(&sync_sem);
}
return NO_ERROR;
}
diff --git a/QCamera2/HAL/QCameraCmdThread.h b/QCamera2/HAL/QCameraCmdThread.h
index c8c4db0..cc84646 100644
--- a/QCamera2/HAL/QCameraCmdThread.h
+++ b/QCamera2/HAL/QCameraCmdThread.h
@@ -31,7 +31,9 @@
#define __QCAMERA_CMD_THREAD_H__
#include <pthread.h>
-#include <semaphore.h>
+#include <cam_semaphore.h>
+
+#include "cam_types.h"
#include "QCameraQueue.h"
namespace android {
@@ -62,8 +64,8 @@
QCameraQueue cmd_queue; /* cmd queue */
pthread_t cmd_pid; /* cmd thread ID */
- sem_t cmd_sem; /* semaphore for cmd thread */
- sem_t sync_sem; /* semaphore for synchronized call signal */
+ cam_semaphore_t cmd_sem; /* semaphore for cmd thread */
+ cam_semaphore_t sync_sem; /* semaphore for synchronized call signal */
};
}; // namespace android
diff --git a/QCamera2/HAL/QCameraPostProc.cpp b/QCamera2/HAL/QCameraPostProc.cpp
index d59e76f..5a46611 100644
--- a/QCamera2/HAL/QCameraPostProc.cpp
+++ b/QCamera2/HAL/QCameraPostProc.cpp
@@ -985,9 +985,9 @@
ALOGD("%s: E", __func__);
do {
do {
- ret = sem_wait(&cmdThread->cmd_sem);
+ ret = cam_sem_wait(&cmdThread->cmd_sem);
if (ret != 0 && errno != EINVAL) {
- ALOGE("%s: sem_wait error (%s)",
+ ALOGE("%s: cam_sem_wait error (%s)",
__func__, strerror(errno));
return NULL;
}
@@ -1090,9 +1090,9 @@
ALOGD("%s: E", __func__);
do {
do {
- ret = sem_wait(&cmdThread->cmd_sem);
+ ret = cam_sem_wait(&cmdThread->cmd_sem);
if (ret != 0 && errno != EINVAL) {
- ALOGE("%s: sem_wait error (%s)",
+ ALOGE("%s: cam_sem_wait error (%s)",
__func__, strerror(errno));
return NULL;
}
@@ -1131,7 +1131,7 @@
pme->m_inputPPQ.flush();
// signal cmd is completed
- sem_post(&cmdThread->sync_sem);
+ cam_sem_post(&cmdThread->sync_sem);
}
break;
case CAMERA_CMD_TYPE_DO_NEXT_JOB:
diff --git a/QCamera2/HAL/QCameraStateMachine.cpp b/QCamera2/HAL/QCameraStateMachine.cpp
index f5b8298..d051a51 100644
--- a/QCamera2/HAL/QCameraStateMachine.cpp
+++ b/QCamera2/HAL/QCameraStateMachine.cpp
@@ -55,9 +55,9 @@
ALOGD("%s: E", __func__);
do {
do {
- ret = sem_wait(&pme->cmd_sem);
+ ret = cam_sem_wait(&pme->cmd_sem);
if (ret != 0 && errno != EINVAL) {
- ALOGE("%s: sem_wait error (%s)",
+ ALOGE("%s: cam_sem_wait error (%s)",
__func__, strerror(errno));
return NULL;
}
@@ -115,7 +115,7 @@
m_parent = ctrl;
m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
cmd_pid = 0;
- sem_init(&cmd_sem, 0, 0);
+ cam_sem_init(&cmd_sem, 0);
pthread_create(&cmd_pid,
NULL,
smEvtProcRoutine,
@@ -141,7 +141,7 @@
node->cmd = QCAMERA_SM_CMD_TYPE_EXIT;
api_queue.enqueue((void *)node);
- sem_post(&cmd_sem);
+ cam_sem_post(&cmd_sem);
/* wait until cmd thread exits */
if (pthread_join(cmd_pid, NULL) != 0) {
@@ -150,7 +150,7 @@
}
cmd_pid = 0;
}
- sem_destroy(&cmd_sem);
+ cam_sem_destroy(&cmd_sem);
}
/*===========================================================================
@@ -181,7 +181,7 @@
node->evt = evt;
node->evt_payload = api_payload;
if (api_queue.enqueue((void *)node)) {
- sem_post(&cmd_sem);
+ cam_sem_post(&cmd_sem);
return NO_ERROR;
} else {
free(node);
@@ -218,7 +218,7 @@
node->evt = evt;
node->evt_payload = evt_payload;
if (evt_queue.enqueue((void *)node)) {
- sem_post(&cmd_sem);
+ cam_sem_post(&cmd_sem);
return NO_ERROR;
} else {
free(node);
diff --git a/QCamera2/HAL/QCameraStateMachine.h b/QCamera2/HAL/QCameraStateMachine.h
index 6ed53fc..1199823 100644
--- a/QCamera2/HAL/QCameraStateMachine.h
+++ b/QCamera2/HAL/QCameraStateMachine.h
@@ -31,14 +31,15 @@
#define __QCAMERA_STATEMACHINE_H__
#include <pthread.h>
-#include <semaphore.h>
-#include "QCameraQueue.h"
-#include "QCameraChannel.h"
+#include <cam_semaphore.h>
extern "C" {
#include <mm_camera_interface.h>
}
+#include "QCameraQueue.h"
+#include "QCameraChannel.h"
+
namespace android {
class QCamera2HardwareInterface;
@@ -181,7 +182,7 @@
QCameraQueue api_queue; // cmd queue for APIs
QCameraQueue evt_queue; // cmd queue for evt from mm-camera-intf/mm-jpeg-intf
pthread_t cmd_pid; // cmd thread ID
- sem_t cmd_sem; // semaphore for cmd thread
+ cam_semaphore_t cmd_sem; // semaphore for cmd thread
};
diff --git a/QCamera2/HAL/QCameraStream.cpp b/QCamera2/HAL/QCameraStream.cpp
index 8c296c4..bcc76fa 100644
--- a/QCamera2/HAL/QCameraStream.cpp
+++ b/QCamera2/HAL/QCameraStream.cpp
@@ -247,9 +247,9 @@
ALOGI("%s: E", __func__);
do {
do {
- ret = sem_wait(&cmdThread->cmd_sem);
+ ret = cam_sem_wait(&cmdThread->cmd_sem);
if (ret != 0 && errno != EINVAL) {
- ALOGE("%s: sem_wait error (%s)",
+ ALOGE("%s: cam_sem_wait error (%s)",
__func__, strerror(errno));
return NULL;
}