Merge "Fix a race condition during Context init/teardown." into honeycomb-mr1
This commit is contained in:
committed by
Android (Google) Code Review
commit
c8a4b11e1f
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user