Loading libs/rs/Android.mk +5 −3 Original line number Diff line number Diff line Loading @@ -87,6 +87,7 @@ LOCAL_SRC_FILES:= \ rsObjectBase.cpp \ rsMatrix.cpp \ rsMesh.cpp \ rsMutex.cpp \ rsNoise.cpp \ rsProgram.cpp \ rsProgramFragment.cpp \ Loading @@ -98,6 +99,7 @@ LOCAL_SRC_FILES:= \ rsScriptC.cpp \ rsScriptC_Lib.cpp \ rsShaderCache.cpp \ rsSignal.cpp \ rsSimpleMesh.cpp \ rsThreadIO.cpp \ rsType.cpp \ Loading libs/rs/rsContext.cpp +7 −19 Original line number Diff line number Diff line Loading @@ -664,8 +664,7 @@ void Context::appendNameDefines(String8 *str) const bool Context::objDestroyOOBInit() { int status = pthread_mutex_init(&mObjDestroy.mMutex, NULL); if (status) { if (!mObjDestroy.mMutex.init()) { LOGE("Context::ObjDestroyOOBInit mutex init failure"); return false; } Loading @@ -675,9 +674,8 @@ bool Context::objDestroyOOBInit() void Context::objDestroyOOBRun() { if (mObjDestroy.mNeedToEmpty) { int status = pthread_mutex_lock(&mObjDestroy.mMutex); if (status) { LOGE("Context::ObjDestroyOOBRun: error %i locking for OOBRun.", status); if (!mObjDestroy.mMutex.lock()) { LOGE("Context::ObjDestroyOOBRun: error locking for OOBRun."); return; } Loading @@ -686,35 +684,25 @@ void Context::objDestroyOOBRun() } mObjDestroy.mDestroyList.clear(); mObjDestroy.mNeedToEmpty = false; status = pthread_mutex_unlock(&mObjDestroy.mMutex); if (status) { LOGE("Context::ObjDestroyOOBRun: error %i unlocking for set condition.", status); } mObjDestroy.mMutex.unlock(); } } void Context::objDestroyOOBDestroy() { rsAssert(!mObjDestroy.mNeedToEmpty); pthread_mutex_destroy(&mObjDestroy.mMutex); } void Context::objDestroyAdd(ObjectBase *obj) { int status = pthread_mutex_lock(&mObjDestroy.mMutex); if (status) { LOGE("Context::ObjDestroyOOBRun: error %i locking for OOBRun.", status); if (!mObjDestroy.mMutex.lock()) { LOGE("Context::ObjDestroyOOBRun: error locking for OOBRun."); return; } mObjDestroy.mNeedToEmpty = true; mObjDestroy.mDestroyList.add(obj); status = pthread_mutex_unlock(&mObjDestroy.mMutex); if (status) { LOGE("Context::ObjDestroyOOBRun: error %i unlocking for set condition.", status); } mObjDestroy.mMutex.unlock(); } uint32_t Context::getMessageToClient(void *data, size_t *receiveLen, size_t bufferLen, bool wait) Loading libs/rs/rsContext.h +2 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #define ANDROID_RS_CONTEXT_H #include "rsUtils.h" #include "rsMutex.h" #include "rsThreadIO.h" #include "rsType.h" Loading Loading @@ -227,7 +228,7 @@ protected: struct ObjDestroyOOB { pthread_mutex_t mMutex; Mutex mMutex; Vector<ObjectBase *> mDestroyList; bool mNeedToEmpty; }; Loading libs/rs/rsLocklessFifo.cpp +10 −82 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ #include "rsLocklessFifo.h" using namespace android; using namespace android::renderscript; LocklessCommandFifo::LocklessCommandFifo() { Loading Loading @@ -128,15 +128,19 @@ void LocklessCommandFifo::flush() //dumpState("flush 2"); } const void * LocklessCommandFifo::get(uint32_t *command, uint32_t *bytesData) void LocklessCommandFifo::wait() { while(1) { //dumpState("get"); while(isEmpty() && !mInShutdown) { mSignalToControl.set(); mSignalToWorker.wait(); } } const void * LocklessCommandFifo::get(uint32_t *command, uint32_t *bytesData) { while(1) { //dumpState("get"); wait(); if (mInShutdown) { *command = 0; *bytesData = 0; Loading Loading @@ -192,79 +196,3 @@ void LocklessCommandFifo::dumpState(const char *s) const LOGV("%s put %p, get %p, buf %p, end %p", s, mPut, mGet, mBuffer, mEnd); } LocklessCommandFifo::Signal::Signal() { mSet = true; } LocklessCommandFifo::Signal::~Signal() { pthread_mutex_destroy(&mMutex); pthread_cond_destroy(&mCondition); } bool LocklessCommandFifo::Signal::init() { int status = pthread_mutex_init(&mMutex, NULL); if (status) { LOGE("LocklessFifo mutex init failure"); return false; } status = pthread_cond_init(&mCondition, NULL); if (status) { LOGE("LocklessFifo condition init failure"); pthread_mutex_destroy(&mMutex); return false; } return true; } void LocklessCommandFifo::Signal::set() { int status; status = pthread_mutex_lock(&mMutex); if (status) { LOGE("LocklessCommandFifo: error %i locking for set condition.", status); return; } mSet = true; status = pthread_cond_signal(&mCondition); if (status) { LOGE("LocklessCommandFifo: error %i on set condition.", status); } status = pthread_mutex_unlock(&mMutex); if (status) { LOGE("LocklessCommandFifo: error %i unlocking for set condition.", status); } } void LocklessCommandFifo::Signal::wait() { int status; status = pthread_mutex_lock(&mMutex); if (status) { LOGE("LocklessCommandFifo: error %i locking for condition.", status); return; } if (!mSet) { status = pthread_cond_wait(&mCondition, &mMutex); if (status) { LOGE("LocklessCommandFifo: error %i waiting on condition.", status); } } mSet = false; status = pthread_mutex_unlock(&mMutex); if (status) { LOGE("LocklessCommandFifo: error %i unlocking for condition.", status); } } libs/rs/rsLocklessFifo.h +5 −19 Original line number Diff line number Diff line Loading @@ -19,8 +19,10 @@ #include "rsUtils.h" #include "rsSignal.h" namespace android { namespace renderscript { // A simple FIFO to be used as a producer / consumer between two Loading @@ -37,24 +39,7 @@ public: LocklessCommandFifo(); ~LocklessCommandFifo(); protected: class Signal { public: Signal(); ~Signal(); bool init(); void set(); void wait(); protected: bool mSet; pthread_mutex_t mMutex; pthread_cond_t mCondition; }; uint8_t * volatile mPut; uint8_t * volatile mGet; uint8_t * mBuffer; Loading @@ -65,14 +50,14 @@ protected: Signal mSignalToWorker; Signal mSignalToControl; public: void * reserve(uint32_t bytes); void commit(uint32_t command, uint32_t bytes); void commitSync(uint32_t command, uint32_t bytes); void flush(); void wait(); const void * get(uint32_t *command, uint32_t *bytesData); void next(); Loading @@ -87,5 +72,6 @@ private: }; } } #endif Loading
libs/rs/Android.mk +5 −3 Original line number Diff line number Diff line Loading @@ -87,6 +87,7 @@ LOCAL_SRC_FILES:= \ rsObjectBase.cpp \ rsMatrix.cpp \ rsMesh.cpp \ rsMutex.cpp \ rsNoise.cpp \ rsProgram.cpp \ rsProgramFragment.cpp \ Loading @@ -98,6 +99,7 @@ LOCAL_SRC_FILES:= \ rsScriptC.cpp \ rsScriptC_Lib.cpp \ rsShaderCache.cpp \ rsSignal.cpp \ rsSimpleMesh.cpp \ rsThreadIO.cpp \ rsType.cpp \ Loading
libs/rs/rsContext.cpp +7 −19 Original line number Diff line number Diff line Loading @@ -664,8 +664,7 @@ void Context::appendNameDefines(String8 *str) const bool Context::objDestroyOOBInit() { int status = pthread_mutex_init(&mObjDestroy.mMutex, NULL); if (status) { if (!mObjDestroy.mMutex.init()) { LOGE("Context::ObjDestroyOOBInit mutex init failure"); return false; } Loading @@ -675,9 +674,8 @@ bool Context::objDestroyOOBInit() void Context::objDestroyOOBRun() { if (mObjDestroy.mNeedToEmpty) { int status = pthread_mutex_lock(&mObjDestroy.mMutex); if (status) { LOGE("Context::ObjDestroyOOBRun: error %i locking for OOBRun.", status); if (!mObjDestroy.mMutex.lock()) { LOGE("Context::ObjDestroyOOBRun: error locking for OOBRun."); return; } Loading @@ -686,35 +684,25 @@ void Context::objDestroyOOBRun() } mObjDestroy.mDestroyList.clear(); mObjDestroy.mNeedToEmpty = false; status = pthread_mutex_unlock(&mObjDestroy.mMutex); if (status) { LOGE("Context::ObjDestroyOOBRun: error %i unlocking for set condition.", status); } mObjDestroy.mMutex.unlock(); } } void Context::objDestroyOOBDestroy() { rsAssert(!mObjDestroy.mNeedToEmpty); pthread_mutex_destroy(&mObjDestroy.mMutex); } void Context::objDestroyAdd(ObjectBase *obj) { int status = pthread_mutex_lock(&mObjDestroy.mMutex); if (status) { LOGE("Context::ObjDestroyOOBRun: error %i locking for OOBRun.", status); if (!mObjDestroy.mMutex.lock()) { LOGE("Context::ObjDestroyOOBRun: error locking for OOBRun."); return; } mObjDestroy.mNeedToEmpty = true; mObjDestroy.mDestroyList.add(obj); status = pthread_mutex_unlock(&mObjDestroy.mMutex); if (status) { LOGE("Context::ObjDestroyOOBRun: error %i unlocking for set condition.", status); } mObjDestroy.mMutex.unlock(); } uint32_t Context::getMessageToClient(void *data, size_t *receiveLen, size_t bufferLen, bool wait) Loading
libs/rs/rsContext.h +2 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #define ANDROID_RS_CONTEXT_H #include "rsUtils.h" #include "rsMutex.h" #include "rsThreadIO.h" #include "rsType.h" Loading Loading @@ -227,7 +228,7 @@ protected: struct ObjDestroyOOB { pthread_mutex_t mMutex; Mutex mMutex; Vector<ObjectBase *> mDestroyList; bool mNeedToEmpty; }; Loading
libs/rs/rsLocklessFifo.cpp +10 −82 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ #include "rsLocklessFifo.h" using namespace android; using namespace android::renderscript; LocklessCommandFifo::LocklessCommandFifo() { Loading Loading @@ -128,15 +128,19 @@ void LocklessCommandFifo::flush() //dumpState("flush 2"); } const void * LocklessCommandFifo::get(uint32_t *command, uint32_t *bytesData) void LocklessCommandFifo::wait() { while(1) { //dumpState("get"); while(isEmpty() && !mInShutdown) { mSignalToControl.set(); mSignalToWorker.wait(); } } const void * LocklessCommandFifo::get(uint32_t *command, uint32_t *bytesData) { while(1) { //dumpState("get"); wait(); if (mInShutdown) { *command = 0; *bytesData = 0; Loading Loading @@ -192,79 +196,3 @@ void LocklessCommandFifo::dumpState(const char *s) const LOGV("%s put %p, get %p, buf %p, end %p", s, mPut, mGet, mBuffer, mEnd); } LocklessCommandFifo::Signal::Signal() { mSet = true; } LocklessCommandFifo::Signal::~Signal() { pthread_mutex_destroy(&mMutex); pthread_cond_destroy(&mCondition); } bool LocklessCommandFifo::Signal::init() { int status = pthread_mutex_init(&mMutex, NULL); if (status) { LOGE("LocklessFifo mutex init failure"); return false; } status = pthread_cond_init(&mCondition, NULL); if (status) { LOGE("LocklessFifo condition init failure"); pthread_mutex_destroy(&mMutex); return false; } return true; } void LocklessCommandFifo::Signal::set() { int status; status = pthread_mutex_lock(&mMutex); if (status) { LOGE("LocklessCommandFifo: error %i locking for set condition.", status); return; } mSet = true; status = pthread_cond_signal(&mCondition); if (status) { LOGE("LocklessCommandFifo: error %i on set condition.", status); } status = pthread_mutex_unlock(&mMutex); if (status) { LOGE("LocklessCommandFifo: error %i unlocking for set condition.", status); } } void LocklessCommandFifo::Signal::wait() { int status; status = pthread_mutex_lock(&mMutex); if (status) { LOGE("LocklessCommandFifo: error %i locking for condition.", status); return; } if (!mSet) { status = pthread_cond_wait(&mCondition, &mMutex); if (status) { LOGE("LocklessCommandFifo: error %i waiting on condition.", status); } } mSet = false; status = pthread_mutex_unlock(&mMutex); if (status) { LOGE("LocklessCommandFifo: error %i unlocking for condition.", status); } }
libs/rs/rsLocklessFifo.h +5 −19 Original line number Diff line number Diff line Loading @@ -19,8 +19,10 @@ #include "rsUtils.h" #include "rsSignal.h" namespace android { namespace renderscript { // A simple FIFO to be used as a producer / consumer between two Loading @@ -37,24 +39,7 @@ public: LocklessCommandFifo(); ~LocklessCommandFifo(); protected: class Signal { public: Signal(); ~Signal(); bool init(); void set(); void wait(); protected: bool mSet; pthread_mutex_t mMutex; pthread_cond_t mCondition; }; uint8_t * volatile mPut; uint8_t * volatile mGet; uint8_t * mBuffer; Loading @@ -65,14 +50,14 @@ protected: Signal mSignalToWorker; Signal mSignalToControl; public: void * reserve(uint32_t bytes); void commit(uint32_t command, uint32_t bytes); void commitSync(uint32_t command, uint32_t bytes); void flush(); void wait(); const void * get(uint32_t *command, uint32_t *bytesData); void next(); Loading @@ -87,5 +72,6 @@ private: }; } } #endif