[mpp_thread]: improve reset lock/condition implement

git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@428 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
ChenHengming
2015-10-25 16:50:57 +00:00
parent 8fcf82c02e
commit 23652564dc
3 changed files with 52 additions and 19 deletions

View File

@@ -84,7 +84,7 @@ static RK_U32 reset_dec_task(Mpp *mpp, HalDecTask *task_dec, PaserTaskWait *wait
{
RK_S32 index;
parser->reset_lock();
parser->lock(THREAD_RESET);
status->curr_task_rdy = 0;
task_dec->valid = 0;
parser_reset(dec->parser);
@@ -112,8 +112,8 @@ static RK_U32 reset_dec_task(Mpp *mpp, HalDecTask *task_dec, PaserTaskWait *wait
}
status->task_parsed_rdy = 0;
parser->reset_unlock();
parser->reset_signal();
parser->unlock(THREAD_RESET);
parser->signal(THREAD_RESET);
}
return MPP_OK;
@@ -164,7 +164,6 @@ void *mpp_dec_parser_thread(void *data)
HalTaskHnd task = NULL;
HalTaskInfo task_local;
HalDecTask *task_dec = &task_local.dec;
MppBuffer buffer = NULL;
hal_task_info_init(&task_local, MPP_CTX_DEC);

View File

@@ -278,16 +278,16 @@ MPP_RET Mpp::reset()
mFrames->flush();
mFrames->unlock();
mThreadCodec->reset_lock();
mThreadCodec->lock(THREAD_RESET);
if (mType == MPP_CTX_DEC) {
mpp_dec_reset(mDec);
mThreadCodec->signal();
mThreadCodec->reset_wait();
mThreadCodec->wait(THREAD_RESET);
} else {
mpp_enc_reset(mEnc);
}
mThreadCodec->reset_unlock();
mThreadCodec->unlock(THREAD_RESET);
return MPP_OK;
}

View File

@@ -153,6 +153,28 @@ inline void Condition::signal()
pthread_cond_signal(&mCond);
}
class MppMutexCond {
public:
MppMutexCond() {};
~MppMutexCond() {};
void lock() { mLock.lock(); }
void unlock() { mLock.unlock(); }
void wait() { mCondition.wait(mLock); }
void signal() { mCondition.signal(); }
private:
Mutex mLock;
Condition mCondition;
};
typedef enum MppThreadSignal_e {
THREAD_WORK,
THREAD_RESET,
THREAD_SIGNAL_BUTT,
} MppThreadSignal;
#define THREAD_NORMAL 0
#define THRE 0
class MppThread
{
@@ -165,21 +187,33 @@ public:
void start();
void stop();
void lock() { mLock.lock(); }
void unlock() { mLock.unlock(); }
void wait() { mCondition.wait(mLock); }
void signal() { mCondition.signal(); }
void reset_lock() { mResetLock.lock(); }
void reset_unlock() { mResetLock.unlock(); }
void reset_wait() { mResetCondition.wait(mResetLock); }
void reset_signal() { mResetCondition.signal(); }
void lock(MppThreadSignal id = THREAD_WORK)
{
mpp_assert(id < THREAD_SIGNAL_BUTT);
mMutexCond[id].lock();
}
void unlock(MppThreadSignal id = THREAD_WORK)
{
mpp_assert(id < THREAD_SIGNAL_BUTT);
mMutexCond[id].unlock();
}
void wait(MppThreadSignal id = THREAD_WORK)
{
mpp_assert(id < THREAD_SIGNAL_BUTT);
mMutexCond[id].wait();
}
void signal(MppThreadSignal id = THREAD_WORK)
{
mpp_assert(id < THREAD_SIGNAL_BUTT);
mMutexCond[id].signal();
}
private:
Mutex mLock;
Condition mCondition;
pthread_t mThread;
Mutex mResetLock;
Condition mResetCondition;
MppMutexCond mMutexCond[THREAD_SIGNAL_BUTT];
MppThreadStatus mStatus;
MppThreadFunc mFunction;