diff options
Diffstat (limited to 'camera')
-rw-r--r-- | camera/Android.mk | 2 | ||||
-rwxr-xr-x | camera/EmulatedCameraDevice.cpp | 20 | ||||
-rwxr-xr-x | camera/EmulatedCameraDevice.h | 2 |
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. */ |