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

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

Seperate out Mutex and Signal code into reusable classes.

Change-Id: I381d09d89b567d433a10a91e0d7e59c24d3444d8
parent 3cfae1bb
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ LOCAL_SRC_FILES:= \
	rsObjectBase.cpp \
	rsMatrix.cpp \
    rsMesh.cpp \
    rsMutex.cpp \
	rsNoise.cpp \
	rsProgram.cpp \
	rsProgramFragment.cpp \
@@ -98,6 +99,7 @@ LOCAL_SRC_FILES:= \
	rsScriptC.cpp \
	rsScriptC_Lib.cpp \
    rsShaderCache.cpp \
	rsSignal.cpp \
	rsSimpleMesh.cpp \
	rsThreadIO.cpp \
	rsType.cpp \
+7 −19
Original line number Diff line number Diff line
@@ -664,8 +664,7 @@ void Context::appendNameDefines(String8 *str) const

bool Context::objDestroyOOBInit()
{
    int status = pthread_mutex_init(&mObjDestroy.mMutex, NULL);
    if (status) {
    if (!mObjDestroy.mMutex.init()) {
        LOGE("Context::ObjDestroyOOBInit mutex init failure");
        return false;
    }
@@ -675,9 +674,8 @@ bool Context::objDestroyOOBInit()
void Context::objDestroyOOBRun()
{
    if (mObjDestroy.mNeedToEmpty) {
        int status = pthread_mutex_lock(&mObjDestroy.mMutex);
        if (status) {
            LOGE("Context::ObjDestroyOOBRun: error %i locking for OOBRun.", status);
        if (!mObjDestroy.mMutex.lock()) {
            LOGE("Context::ObjDestroyOOBRun: error locking for OOBRun.");
            return;
        }

@@ -686,35 +684,25 @@ void Context::objDestroyOOBRun()
        }
        mObjDestroy.mDestroyList.clear();
        mObjDestroy.mNeedToEmpty = false;

        status = pthread_mutex_unlock(&mObjDestroy.mMutex);
        if (status) {
            LOGE("Context::ObjDestroyOOBRun: error %i unlocking for set condition.", status);
        }
        mObjDestroy.mMutex.unlock();
    }
}

void Context::objDestroyOOBDestroy()
{
    rsAssert(!mObjDestroy.mNeedToEmpty);
    pthread_mutex_destroy(&mObjDestroy.mMutex);
}

void Context::objDestroyAdd(ObjectBase *obj)
{
    int status = pthread_mutex_lock(&mObjDestroy.mMutex);
    if (status) {
        LOGE("Context::ObjDestroyOOBRun: error %i locking for OOBRun.", status);
    if (!mObjDestroy.mMutex.lock()) {
        LOGE("Context::ObjDestroyOOBRun: error locking for OOBRun.");
        return;
    }

    mObjDestroy.mNeedToEmpty = true;
    mObjDestroy.mDestroyList.add(obj);

    status = pthread_mutex_unlock(&mObjDestroy.mMutex);
    if (status) {
        LOGE("Context::ObjDestroyOOBRun: error %i unlocking for set condition.", status);
    }
    mObjDestroy.mMutex.unlock();
}

uint32_t Context::getMessageToClient(void *data, size_t *receiveLen, size_t bufferLen, bool wait)
+2 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#define ANDROID_RS_CONTEXT_H

#include "rsUtils.h"
#include "rsMutex.h"

#include "rsThreadIO.h"
#include "rsType.h"
@@ -227,7 +228,7 @@ protected:


    struct ObjDestroyOOB {
        pthread_mutex_t mMutex;
        Mutex mMutex;
        Vector<ObjectBase *> mDestroyList;
        bool mNeedToEmpty;
    };
+10 −82
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@
#include "rsLocklessFifo.h"

using namespace android;

using namespace android::renderscript;

LocklessCommandFifo::LocklessCommandFifo()
{
@@ -128,15 +128,19 @@ void LocklessCommandFifo::flush()
    //dumpState("flush 2");
}

const void * LocklessCommandFifo::get(uint32_t *command, uint32_t *bytesData)
void LocklessCommandFifo::wait()
{
    while(1) {
        //dumpState("get");
    while(isEmpty() && !mInShutdown) {
        mSignalToControl.set();
        mSignalToWorker.wait();
    }
}

const void * LocklessCommandFifo::get(uint32_t *command, uint32_t *bytesData)
{
    while(1) {
        //dumpState("get");
        wait();
        if (mInShutdown) {
            *command = 0;
            *bytesData = 0;
@@ -192,79 +196,3 @@ void LocklessCommandFifo::dumpState(const char *s) const
    LOGV("%s  put %p, get %p,  buf %p,  end %p", s, mPut, mGet, mBuffer, mEnd);
}
LocklessCommandFifo::Signal::Signal()
{
    mSet = true;
}

LocklessCommandFifo::Signal::~Signal()
{
    pthread_mutex_destroy(&mMutex);
    pthread_cond_destroy(&mCondition);
}

bool LocklessCommandFifo::Signal::init()
{
    int status = pthread_mutex_init(&mMutex, NULL);
    if (status) {
        LOGE("LocklessFifo mutex init failure");
        return false;
    }

    status = pthread_cond_init(&mCondition, NULL);
    if (status) {
        LOGE("LocklessFifo condition init failure");
        pthread_mutex_destroy(&mMutex);
        return false;
    }

    return true;
}

void LocklessCommandFifo::Signal::set()
{
    int status;

    status = pthread_mutex_lock(&mMutex);
    if (status) {
        LOGE("LocklessCommandFifo: error %i locking for set condition.", status);
        return;
    }

    mSet = true;

    status = pthread_cond_signal(&mCondition);
    if (status) {
        LOGE("LocklessCommandFifo: error %i on set condition.", status);
    }

    status = pthread_mutex_unlock(&mMutex);
    if (status) {
        LOGE("LocklessCommandFifo: error %i unlocking for set condition.", status);
    }
}

void LocklessCommandFifo::Signal::wait()
{
    int status;

    status = pthread_mutex_lock(&mMutex);
    if (status) {
        LOGE("LocklessCommandFifo: error %i locking for condition.", status);
        return;
    }

    if (!mSet) {
        status = pthread_cond_wait(&mCondition, &mMutex);
        if (status) {
            LOGE("LocklessCommandFifo: error %i waiting on condition.", status);
        }
    }
    mSet = false;

    status = pthread_mutex_unlock(&mMutex);
    if (status) {
        LOGE("LocklessCommandFifo: error %i unlocking for condition.", status);
    }
}
+5 −19
Original line number Diff line number Diff line
@@ -19,8 +19,10 @@


#include "rsUtils.h"
#include "rsSignal.h"

namespace android {
namespace renderscript {


// A simple FIFO to be used as a producer / consumer between two
@@ -37,24 +39,7 @@ public:
    LocklessCommandFifo();
    ~LocklessCommandFifo();


protected:
    class Signal {
    public:
        Signal();
        ~Signal();

        bool init();

        void set();
        void wait();

protected:
        bool mSet;
        pthread_mutex_t mMutex;
        pthread_cond_t mCondition;
    };

    uint8_t * volatile mPut;
    uint8_t * volatile mGet;
    uint8_t * mBuffer;
@@ -65,14 +50,14 @@ protected:
    Signal mSignalToWorker;
    Signal mSignalToControl;



public:
    void * reserve(uint32_t bytes);
    void commit(uint32_t command, uint32_t bytes);
    void commitSync(uint32_t command, uint32_t bytes);

    void flush();
    void wait();

    const void * get(uint32_t *command, uint32_t *bytesData);
    void next();

@@ -87,5 +72,6 @@ private:
};


}
}
#endif
Loading