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;
             }