am 41c19db9: Remove hack in RS that called exit to WAR now fixed driver bugs. Make gloabal init safe by locking around the critical code.

Merge commit '41c19db90e250e2b7cb438904f0e96a0ef455d6d' into eclair-mr2

* commit '41c19db90e250e2b7cb438904f0e96a0ef455d6d':
  Remove hack in RS that called exit to WAR now fixed driver bugs.  Make gloabal init safe by locking around the critical code.
This commit is contained in:
Jason Sams
2009-10-15 19:06:43 -07:00
committed by Android Git Automerger
2 changed files with 20 additions and 5 deletions

View File

@@ -29,6 +29,8 @@ using namespace android;
using namespace android::renderscript; using namespace android::renderscript;
pthread_key_t Context::gThreadTLSKey = 0; pthread_key_t Context::gThreadTLSKey = 0;
uint32_t Context::gThreadTLSKeyCount = 0;
pthread_mutex_t Context::gInitMutex = PTHREAD_MUTEX_INITIALIZER;
void Context::initEGL() void Context::initEGL()
{ {
@@ -300,6 +302,8 @@ void * Context::threadProc(void *vrsc)
Context::Context(Device *dev, Surface *sur, bool useDepth) Context::Context(Device *dev, Surface *sur, bool useDepth)
{ {
pthread_mutex_lock(&gInitMutex);
dev->addContext(this); dev->addContext(this);
mDev = dev; mDev = dev;
mRunning = false; mRunning = false;
@@ -311,16 +315,18 @@ Context::Context(Device *dev, Surface *sur, bool useDepth)
int status; int status;
pthread_attr_t threadAttr; pthread_attr_t threadAttr;
if (!gThreadTLSKey) { if (!gThreadTLSKeyCount) {
status = pthread_key_create(&gThreadTLSKey, NULL); status = pthread_key_create(&gThreadTLSKey, NULL);
if (status) { if (status) {
LOGE("Failed to init thread tls key."); LOGE("Failed to init thread tls key.");
pthread_mutex_unlock(&gInitMutex);
return; 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); status = pthread_attr_init(&threadAttr);
if (status) { if (status) {
@@ -362,10 +368,16 @@ Context::~Context()
int status = pthread_join(mThreadId, &res); int status = pthread_join(mThreadId, &res);
objDestroyOOBRun(); objDestroyOOBRun();
// Global structure cleanup.
pthread_mutex_lock(&gInitMutex);
if (mDev) { if (mDev) {
mDev->removeContext(this); mDev->removeContext(this);
pthread_key_delete(gThreadTLSKey); --gThreadTLSKeyCount;
if (!gThreadTLSKeyCount) {
pthread_key_delete(gThreadTLSKey);
}
} }
pthread_mutex_unlock(&gInitMutex);
objDestroyOOBDestroy(); objDestroyOOBDestroy();
} }

View File

@@ -53,6 +53,9 @@ public:
~Context(); ~Context();
static pthread_key_t gThreadTLSKey; static pthread_key_t gThreadTLSKey;
static uint32_t gThreadTLSKeyCount;
static pthread_mutex_t gInitMutex;
struct ScriptTLSStruct { struct ScriptTLSStruct {
Context * mContext; Context * mContext;
Script * mScript; Script * mScript;