summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorJason Sams <rjsams@android.com>2009-08-25 14:49:07 -0700
committerJason Sams <rjsams@android.com>2009-08-25 14:49:07 -0700
commitf5b4596a383b6ab83f92edecfe054e80b555c2d0 (patch)
tree76f91ae57eadbd3944c6368c9ff571534097ce54 /libs
parentc69a8807f3aae255c9fe61c4f61bc1ebdd355543 (diff)
downloadframeworks_base-f5b4596a383b6ab83f92edecfe054e80b555c2d0.zip
frameworks_base-f5b4596a383b6ab83f92edecfe054e80b555c2d0.tar.gz
frameworks_base-f5b4596a383b6ab83f92edecfe054e80b555c2d0.tar.bz2
Implement java interface for RS shutdown and fix shutdown deadlock with the command fifo.
Diffstat (limited to 'libs')
-rw-r--r--libs/rs/rsContext.cpp4
-rw-r--r--libs/rs/rsLocklessFifo.cpp19
-rw-r--r--libs/rs/rsLocklessFifo.h6
-rw-r--r--libs/rs/rsThreadIO.cpp5
-rw-r--r--libs/rs/rsThreadIO.h2
5 files changed, 30 insertions, 6 deletions
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);