summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Sams <rjsams@android.com>2010-08-18 12:38:03 -0700
committerJason Sams <rjsams@android.com>2010-08-18 12:38:03 -0700
commit8c46b10a1af7151f9453651f9e6def0237a6f7d8 (patch)
treea4665f303fef2e648aa39f018e8a7c870012ea87
parentf47eec31a9112daead78cfb8ebbda2c3372f4892 (diff)
downloadrs-8c46b10a1af7151f9453651f9e6def0237a6f7d8.tar.gz
Fix bug looping non-blocking fifos.
Change-Id: I33dcf575466bfef672af4e113ad692397b5213e9
-rw-r--r--rsContext.cpp2
-rw-r--r--rsLocklessFifo.cpp27
-rw-r--r--rsLocklessFifo.h1
3 files changed, 28 insertions, 2 deletions
diff --git a/rsContext.cpp b/rsContext.cpp
index 1a7c5ad6..08dd57bf 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -744,7 +744,7 @@ bool Context::sendMessageToClient(void *data, uint32_t cmdID, size_t len, bool w
return false;
}
if (!waitForSpace) {
- if (mIO.mToClient.getFreeSpace() <= (len + 8)) {
+ if (!mIO.mToClient.makeSpaceNonBlocking(len + 8)) {
// Not enough room, and not waiting.
return false;
}
diff --git a/rsLocklessFifo.cpp b/rsLocklessFifo.cpp
index 76ca32e9..019ea72b 100644
--- a/rsLocklessFifo.cpp
+++ b/rsLocklessFifo.cpp
@@ -169,6 +169,30 @@ void LocklessCommandFifo::next()
//dumpState("next");
}
+bool LocklessCommandFifo::makeSpaceNonBlocking(uint32_t bytes)
+{
+ //dumpState("make space non-blocking");
+ if ((mPut+bytes) > mEnd) {
+ // Need to loop regardless of where get is.
+ if((mGet > mPut) && (mBuffer+4 >= mGet)) {
+ return false;
+ }
+
+ // Toss in a reset then the normal wait for space will do the rest.
+ reinterpret_cast<uint16_t *>(mPut)[0] = 0;
+ reinterpret_cast<uint16_t *>(mPut)[1] = 0;
+ mPut = mBuffer;
+ mSignalToWorker.set();
+ }
+
+ // it will fit here so we just need to wait for space.
+ if(getFreeSpace() < bytes) {
+ return false;
+ }
+
+ return true;
+}
+
void LocklessCommandFifo::makeSpace(uint32_t bytes)
{
//dumpState("make space");
@@ -182,6 +206,7 @@ void LocklessCommandFifo::makeSpace(uint32_t bytes)
reinterpret_cast<uint16_t *>(mPut)[0] = 0;
reinterpret_cast<uint16_t *>(mPut)[1] = 0;
mPut = mBuffer;
+ mSignalToWorker.set();
}
// it will fit here so we just need to wait for space.
@@ -193,6 +218,6 @@ void LocklessCommandFifo::makeSpace(uint32_t bytes)
void LocklessCommandFifo::dumpState(const char *s) const
{
- LOGV("%s put %p, get %p, buf %p, end %p", s, mPut, mGet, mBuffer, mEnd);
+ LOGV("%s %p put %p, get %p, buf %p, end %p", s, this, mPut, mGet, mBuffer, mEnd);
}
diff --git a/rsLocklessFifo.h b/rsLocklessFifo.h
index ae906ca6..b8ceeed3 100644
--- a/rsLocklessFifo.h
+++ b/rsLocklessFifo.h
@@ -62,6 +62,7 @@ public:
void next();
void makeSpace(uint32_t bytes);
+ bool makeSpaceNonBlocking(uint32_t bytes);
bool isEmpty() const;
uint32_t getFreeSpace() const;