summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBo Hu <bohu@google.com>2015-03-27 16:43:20 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-03-27 16:43:21 +0000
commitdbfa611bc53481db88e20192491747a2c87702a3 (patch)
tree08032b3fb605d5eaf7240cca6323f3cb9a22251c
parent2b763c9fec35bcab3689785ad808a4317772acae (diff)
parentb3f642f2a22cd58e64e0dc6326e946ef7fd7589f (diff)
downloadandroid_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-xcamera/EmulatedCameraDevice.cpp20
-rwxr-xr-xcamera/EmulatedCameraDevice.h2
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. */