diff options
| author | Jason Sams <rjsams@android.com> | 2009-10-15 16:47:31 -0700 |
|---|---|---|
| committer | Jason Sams <rjsams@android.com> | 2009-10-15 16:47:31 -0700 |
| commit | 41c19db90e250e2b7cb438904f0e96a0ef455d6d (patch) | |
| tree | 08549838621bf28fcb048d395b3255b7605dda56 | |
| parent | c7412b3b08d62c298dc7c3e5f369f406a3c0eac2 (diff) | |
| download | frameworks_base-41c19db90e250e2b7cb438904f0e96a0ef455d6d.zip frameworks_base-41c19db90e250e2b7cb438904f0e96a0ef455d6d.tar.gz frameworks_base-41c19db90e250e2b7cb438904f0e96a0ef455d6d.tar.bz2 | |
Remove hack in RS that called exit to WAR now fixed driver bugs. Make gloabal init safe by locking around the critical code.
| -rw-r--r-- | libs/rs/rsContext.cpp | 22 | ||||
| -rw-r--r-- | libs/rs/rsContext.h | 3 |
2 files changed, 20 insertions, 5 deletions
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 5127717..2b3d076 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -29,6 +29,8 @@ using namespace android; using namespace android::renderscript; pthread_key_t Context::gThreadTLSKey = 0; +uint32_t Context::gThreadTLSKeyCount = 0; +pthread_mutex_t Context::gInitMutex = PTHREAD_MUTEX_INITIALIZER; void Context::initEGL() { @@ -300,6 +302,8 @@ void * Context::threadProc(void *vrsc) Context::Context(Device *dev, Surface *sur, bool useDepth) { + pthread_mutex_lock(&gInitMutex); + dev->addContext(this); mDev = dev; mRunning = false; @@ -311,16 +315,18 @@ Context::Context(Device *dev, Surface *sur, bool useDepth) int status; pthread_attr_t threadAttr; - if (!gThreadTLSKey) { + if (!gThreadTLSKeyCount) { status = pthread_key_create(&gThreadTLSKey, NULL); if (status) { LOGE("Failed to init thread tls key."); + pthread_mutex_unlock(&gInitMutex); return; } - } else { - // HACK: workaround gl hang on start - exit(-1); } + gThreadTLSKeyCount++; + pthread_mutex_unlock(&gInitMutex); + + // Global init done at this point. status = pthread_attr_init(&threadAttr); if (status) { @@ -362,10 +368,16 @@ Context::~Context() int status = pthread_join(mThreadId, &res); objDestroyOOBRun(); + // Global structure cleanup. + pthread_mutex_lock(&gInitMutex); if (mDev) { mDev->removeContext(this); - pthread_key_delete(gThreadTLSKey); + --gThreadTLSKeyCount; + if (!gThreadTLSKeyCount) { + pthread_key_delete(gThreadTLSKey); + } } + pthread_mutex_unlock(&gInitMutex); objDestroyOOBDestroy(); } diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index 3570e10..0dd90ed 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -53,6 +53,9 @@ public: ~Context(); static pthread_key_t gThreadTLSKey; + static uint32_t gThreadTLSKeyCount; + static pthread_mutex_t gInitMutex; + struct ScriptTLSStruct { Context * mContext; Script * mScript; |
