From 8c46b10a1af7151f9453651f9e6def0237a6f7d8 Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Wed, 18 Aug 2010 12:38:03 -0700 Subject: Fix bug looping non-blocking fifos. Change-Id: I33dcf575466bfef672af4e113ad692397b5213e9 --- rsLocklessFifo.cpp | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'rsLocklessFifo.cpp') 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(mPut)[0] = 0; + reinterpret_cast(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(mPut)[0] = 0; reinterpret_cast(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); } -- cgit v1.2.3