Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0cb106f authored by Jason Sams's avatar Jason Sams
Browse files

Fix bug looping non-blocking fifos.

Change-Id: I33dcf575466bfef672af4e113ad692397b5213e9
parent d78be37d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
        }
+26 −1
Original line number Diff line number Diff line
@@ -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);
}
+1 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ public:
    void next();

    void makeSpace(uint32_t bytes);
    bool makeSpaceNonBlocking(uint32_t bytes);

    bool isEmpty() const;
    uint32_t getFreeSpace() const;