Merge "Fix a race condition during Context init/teardown." into honeycomb-mr1

This commit is contained in:
Stephen Hines
2011-03-09 14:29:57 -08:00
committed by Android (Google) Code Review

View File

@@ -592,11 +592,11 @@ void * Context::helperThreadProc(void *vrsc) {
void Context::launchThreads(WorkerCallback_t cbk, void *data) { void Context::launchThreads(WorkerCallback_t cbk, void *data) {
mWorkers.mLaunchData = data; mWorkers.mLaunchData = data;
mWorkers.mLaunchCallback = cbk; mWorkers.mLaunchCallback = cbk;
mWorkers.mRunningCount = (int)mWorkers.mCount; android_atomic_release_store(mWorkers.mCount, &mWorkers.mRunningCount);
for (uint32_t ct = 0; ct < mWorkers.mCount; ct++) { for (uint32_t ct = 0; ct < mWorkers.mCount; ct++) {
mWorkers.mLaunchSignals[ct].set(); mWorkers.mLaunchSignals[ct].set();
} }
while (mWorkers.mRunningCount) { while (android_atomic_acquire_load(&mWorkers.mRunningCount) != 0) {
mWorkers.mCompleteSignal.wait(); mWorkers.mCompleteSignal.wait();
} }
} }
@@ -707,8 +707,8 @@ bool Context::initContext(Device *dev, const RsSurfaceConfig *sc) {
} }
mWorkers.mCompleteSignal.init(); mWorkers.mCompleteSignal.init();
mWorkers.mRunningCount = 0; android_atomic_release_store(mWorkers.mCount, &mWorkers.mRunningCount);
mWorkers.mLaunchCount = 0; android_atomic_release_store(0, &mWorkers.mLaunchCount);
for (uint32_t ct=0; ct < mWorkers.mCount; ct++) { for (uint32_t ct=0; ct < mWorkers.mCount; ct++) {
status = pthread_create(&mWorkers.mThreadId[ct], &threadAttr, helperThreadProc, this); status = pthread_create(&mWorkers.mThreadId[ct], &threadAttr, helperThreadProc, this);
if (status) { if (status) {
@@ -717,6 +717,9 @@ bool Context::initContext(Device *dev, const RsSurfaceConfig *sc) {
break; break;
} }
} }
while (android_atomic_acquire_load(&mWorkers.mRunningCount) != 0) {
usleep(100);
}
pthread_attr_destroy(&threadAttr); pthread_attr_destroy(&threadAttr);
return true; return true;
} }
@@ -736,14 +739,14 @@ Context::~Context() {
// Cleanup compute threads. // Cleanup compute threads.
mWorkers.mLaunchData = NULL; mWorkers.mLaunchData = NULL;
mWorkers.mLaunchCallback = NULL; mWorkers.mLaunchCallback = NULL;
mWorkers.mRunningCount = (int)mWorkers.mCount; android_atomic_release_store(mWorkers.mCount, &mWorkers.mRunningCount);
for (uint32_t ct = 0; ct < mWorkers.mCount; ct++) { for (uint32_t ct = 0; ct < mWorkers.mCount; ct++) {
mWorkers.mLaunchSignals[ct].set(); mWorkers.mLaunchSignals[ct].set();
} }
for (uint32_t ct = 0; ct < mWorkers.mCount; ct++) { for (uint32_t ct = 0; ct < mWorkers.mCount; ct++) {
status = pthread_join(mWorkers.mThreadId[ct], &res); status = pthread_join(mWorkers.mThreadId[ct], &res);
} }
rsAssert(!mWorkers.mRunningCount); rsAssert(android_atomic_acquire_load(&mWorkers.mRunningCount) == 0);
// Global structure cleanup. // Global structure cleanup.
pthread_mutex_lock(&gInitMutex); pthread_mutex_lock(&gInitMutex);