diff options
-rw-r--r-- | graphics/java/android/renderscript/RenderScript.java | 7 | ||||
-rw-r--r-- | libs/rs/rsContext.cpp | 4 | ||||
-rw-r--r-- | libs/rs/rsLocklessFifo.cpp | 19 | ||||
-rw-r--r-- | libs/rs/rsLocklessFifo.h | 6 | ||||
-rw-r--r-- | libs/rs/rsThreadIO.cpp | 5 | ||||
-rw-r--r-- | libs/rs/rsThreadIO.h | 2 |
6 files changed, 37 insertions, 6 deletions
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index 01926e9..84890038 100644 --- a/graphics/java/android/renderscript/RenderScript.java +++ b/graphics/java/android/renderscript/RenderScript.java @@ -206,6 +206,13 @@ public class RenderScript { } } + public void destroy() { + nContextDestroy(mContext); + mContext = 0; + + nDeviceDestroy(mDev); + mDev = 0; + } ////////////////////////////////////////////////////////////////////////////////// // Triangle Mesh diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index c8c69a8..3ebfdce 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -243,11 +243,13 @@ void * Context::threadProc(void *vrsc) } } + LOGV("RS Thread exiting"); glClearColor(0,0,0,0); glClear(GL_COLOR_BUFFER_BIT); eglSwapBuffers(rsc->mEGL.mDisplay, rsc->mEGL.mSurface); eglTerminate(rsc->mEGL.mDisplay); rsc->objDestroyOOBRun(); + LOGV("RS Thread exited"); return NULL; } @@ -298,9 +300,11 @@ Context::Context(Device *dev, Surface *sur, bool useDepth) Context::~Context() { + LOGV("Context::~Context"); mExit = true; void *res; + mIO.shutdown(); int status = pthread_join(mThreadId, &res); objDestroyOOBRun(); diff --git a/libs/rs/rsLocklessFifo.cpp b/libs/rs/rsLocklessFifo.cpp index c3fee54..0c40389 100644 --- a/libs/rs/rsLocklessFifo.cpp +++ b/libs/rs/rsLocklessFifo.cpp @@ -25,6 +25,16 @@ LocklessCommandFifo::LocklessCommandFifo() LocklessCommandFifo::~LocklessCommandFifo() { + if (!mInShutdown) { + shutdown(); + } + free(mBuffer); +} + +void LocklessCommandFifo::shutdown() +{ + mInShutdown = true; + mSignalToWorker.set(); } bool LocklessCommandFifo::init(uint32_t sizeInBytes) @@ -42,6 +52,7 @@ bool LocklessCommandFifo::init(uint32_t sizeInBytes) return false; } + mInShutdown = false; mSize = sizeInBytes; mPut = mBuffer; mGet = mBuffer; @@ -50,7 +61,7 @@ bool LocklessCommandFifo::init(uint32_t sizeInBytes) return true; } -uint32_t LocklessCommandFifo::getFreeSpace() const +uint32_t LocklessCommandFifo::getFreeSpace() const { int32_t freeSpace = 0; //dumpState("getFreeSpace"); @@ -115,7 +126,7 @@ const void * LocklessCommandFifo::get(uint32_t *command, uint32_t *bytesData) { while(1) { //dumpState("get"); - while(isEmpty()) { + while(isEmpty() && !mInShutdown) { mSignalToControl.set(); mSignalToWorker.wait(); } @@ -126,7 +137,7 @@ const void * LocklessCommandFifo::get(uint32_t *command, uint32_t *bytesData) // non-zero command is valid return mGet+4; } - + // zero command means reset to beginning. mGet = mBuffer; } @@ -161,7 +172,7 @@ void LocklessCommandFifo::makeSpace(uint32_t bytes) while(getFreeSpace() < bytes) { sleep(1); } - + } void LocklessCommandFifo::dumpState(const char *s) const diff --git a/libs/rs/rsLocklessFifo.h b/libs/rs/rsLocklessFifo.h index abeddf7..d0a4356 100644 --- a/libs/rs/rsLocklessFifo.h +++ b/libs/rs/rsLocklessFifo.h @@ -25,13 +25,14 @@ namespace android { // A simple FIFO to be used as a producer / consumer between two // threads. One is writer and one is reader. The common cases -// will not require locking. It is not threadsafe for multiple +// will not require locking. It is not threadsafe for multiple // readers or writers by design. -class LocklessCommandFifo +class LocklessCommandFifo { public: bool init(uint32_t size); + void shutdown(); LocklessCommandFifo(); ~LocklessCommandFifo(); @@ -59,6 +60,7 @@ protected: uint8_t * mBuffer; uint8_t * mEnd; uint8_t mSize; + bool mInShutdown; Signal mSignalToWorker; Signal mSignalToControl; diff --git a/libs/rs/rsThreadIO.cpp b/libs/rs/rsThreadIO.cpp index 4a1dbbb..db4bb81 100644 --- a/libs/rs/rsThreadIO.cpp +++ b/libs/rs/rsThreadIO.cpp @@ -30,6 +30,11 @@ ThreadIO::~ThreadIO() { } +void ThreadIO::shutdown() +{ + mToCore.shutdown(); +} + bool ThreadIO::playCoreCommands(Context *con, bool waitForCommand) { bool ret = false; diff --git a/libs/rs/rsThreadIO.h b/libs/rs/rsThreadIO.h index 4aab1b4..1f6a0c2 100644 --- a/libs/rs/rsThreadIO.h +++ b/libs/rs/rsThreadIO.h @@ -31,6 +31,8 @@ public: ThreadIO(); ~ThreadIO(); + void shutdown(); + // Plays back commands from the client. // Returns true if any commands were processed. bool playCoreCommands(Context *con, bool waitForCommand); |