summaryrefslogtreecommitdiffstats
path: root/camera
diff options
context:
space:
mode:
Diffstat (limited to 'camera')
-rw-r--r--camera/Android.mk2
-rwxr-xr-xcamera/EmulatedCameraDevice.cpp20
-rwxr-xr-xcamera/EmulatedCameraDevice.h2
3 files changed, 22 insertions, 2 deletions
diff --git a/camera/Android.mk b/camera/Android.mk
index e297778..8982c71 100644
--- a/camera/Android.mk
+++ b/camera/Android.mk
@@ -20,6 +20,7 @@ include $(CLEAR_VARS)
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_CFLAGS += -fno-short-enums -DQEMU_HARDWARE
LOCAL_CFLAGS += -Wno-unused-parameter -Wno-missing-field-initializers
+LOCAL_CLANG_CFLAGS += -Wno-c++11-narrowing
LOCAL_SHARED_LIBRARIES:= \
libbinder \
liblog \
@@ -80,6 +81,7 @@ include $(CLEAR_VARS)
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_CFLAGS += -fno-short-enums -DQEMU_HARDWARE
LOCAL_CFLAGS += -Wno-unused-parameter
+LOCAL_CLANG_CFLAGS += -Wno-c++11-narrowing
LOCAL_SHARED_LIBRARIES:= \
libcutils \
liblog \
diff --git a/camera/EmulatedCameraDevice.cpp b/camera/EmulatedCameraDevice.cpp
index b76353d..c8e5640 100755
--- a/camera/EmulatedCameraDevice.cpp
+++ b/camera/EmulatedCameraDevice.cpp
@@ -291,16 +291,21 @@ status_t EmulatedCameraDevice::WorkerThread::readyToRun()
"%s: Thread control FDs are opened", __FUNCTION__);
/* Create a pair of FDs that would be used to control the thread. */
int thread_fds[2];
+ status_t ret;
+ Mutex::Autolock lock(mCameraDevice->mObjectLock);
if (pipe(thread_fds) == 0) {
mThreadControl = thread_fds[1];
mControlFD = thread_fds[0];
ALOGV("Emulated device's worker thread has been started.");
- return NO_ERROR;
+ ret = NO_ERROR;
} else {
ALOGE("%s: Unable to create thread control FDs: %d -> %s",
__FUNCTION__, errno, strerror(errno));
- return errno;
+ ret = errno;
}
+
+ mSetup.signal();
+ return ret;
}
status_t EmulatedCameraDevice::WorkerThread::stopThread()
@@ -308,6 +313,17 @@ status_t EmulatedCameraDevice::WorkerThread::stopThread()
ALOGV("Stopping emulated camera device's worker thread...");
status_t res = EINVAL;
+
+ // Limit the scope of the Autolock
+ {
+ // If thread is running and readyToRun() has not finished running,
+ // then wait until it is done.
+ Mutex::Autolock lock(mCameraDevice->mObjectLock);
+ if (isRunning() && (mThreadControl < 0 || mControlFD < 0)) {
+ mSetup.wait(mCameraDevice->mObjectLock);
+ }
+ }
+
if (mThreadControl >= 0) {
/* Send "stop" message to the thread loop. */
const ControlMessage msg = THREAD_STOP;
diff --git a/camera/EmulatedCameraDevice.h b/camera/EmulatedCameraDevice.h
index b7cdcb7..ee9f7dd 100755
--- a/camera/EmulatedCameraDevice.h
+++ b/camera/EmulatedCameraDevice.h
@@ -467,6 +467,8 @@ protected:
/* Stop the thread. */
THREAD_STOP
};
+
+ Condition mSetup;
};
/* Worker thread accessor. */