diff options
author | Bo Hu <bohu@google.com> | 2015-03-27 16:43:20 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-03-27 16:43:21 +0000 |
commit | dbfa611bc53481db88e20192491747a2c87702a3 (patch) | |
tree | 08032b3fb605d5eaf7240cca6323f3cb9a22251c | |
parent | 2b763c9fec35bcab3689785ad808a4317772acae (diff) | |
parent | b3f642f2a22cd58e64e0dc6326e946ef7fd7589f (diff) | |
download | android_device_generic_goldfish-dbfa611bc53481db88e20192491747a2c87702a3.tar.gz android_device_generic_goldfish-dbfa611bc53481db88e20192491747a2c87702a3.tar.bz2 android_device_generic_goldfish-dbfa611bc53481db88e20192491747a2c87702a3.zip |
Merge "Fix inconsistant results for some cts tests."
-rwxr-xr-x | camera/EmulatedCameraDevice.cpp | 20 | ||||
-rwxr-xr-x | camera/EmulatedCameraDevice.h | 2 |
2 files changed, 20 insertions, 2 deletions
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. */ |