diff options
author | Bo Hu <bohu@google.com> | 2015-03-27 16:55:49 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-03-27 16:55:49 +0000 |
commit | 8e39c79622b79f4b5faf53123acefa5c5bda5eed (patch) | |
tree | 08032b3fb605d5eaf7240cca6323f3cb9a22251c | |
parent | 9cf8ded9783bbd05f8c4b3454164af4b5782a262 (diff) | |
parent | dbfa611bc53481db88e20192491747a2c87702a3 (diff) | |
download | android_device_generic_goldfish-8e39c79622b79f4b5faf53123acefa5c5bda5eed.tar.gz android_device_generic_goldfish-8e39c79622b79f4b5faf53123acefa5c5bda5eed.tar.bz2 android_device_generic_goldfish-8e39c79622b79f4b5faf53123acefa5c5bda5eed.zip |
am dbfa611b: Merge "Fix inconsistant results for some cts tests."
* commit 'dbfa611bc53481db88e20192491747a2c87702a3':
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. */ |