[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; RK_S32 index;
parser->reset_lock(); parser->lock(THREAD_RESET);
status->curr_task_rdy = 0; status->curr_task_rdy = 0;
task_dec->valid = 0; task_dec->valid = 0;
parser_reset(dec->parser); 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; status->task_parsed_rdy = 0;
parser->reset_unlock(); parser->unlock(THREAD_RESET);
parser->reset_signal(); parser->signal(THREAD_RESET);
} }
return MPP_OK; return MPP_OK;
@@ -164,7 +164,6 @@ void *mpp_dec_parser_thread(void *data)
HalTaskHnd task = NULL; HalTaskHnd task = NULL;
HalTaskInfo task_local; HalTaskInfo task_local;
HalDecTask *task_dec = &task_local.dec; HalDecTask *task_dec = &task_local.dec;
MppBuffer buffer = NULL;
hal_task_info_init(&task_local, MPP_CTX_DEC); hal_task_info_init(&task_local, MPP_CTX_DEC);

View File

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

View File

@@ -153,6 +153,28 @@ inline void Condition::signal()
pthread_cond_signal(&mCond); 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 class MppThread
{ {
@@ -165,21 +187,33 @@ public:
void start(); void start();
void stop(); 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 lock(MppThreadSignal id = THREAD_WORK)
void reset_unlock() { mResetLock.unlock(); } {
void reset_wait() { mResetCondition.wait(mResetLock); } mpp_assert(id < THREAD_SIGNAL_BUTT);
void reset_signal() { mResetCondition.signal(); } 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: private:
Mutex mLock;
Condition mCondition;
pthread_t mThread; pthread_t mThread;
Mutex mResetLock; MppMutexCond mMutexCond[THREAD_SIGNAL_BUTT];
Condition mResetCondition;
MppThreadStatus mStatus; MppThreadStatus mStatus;
MppThreadFunc mFunction; MppThreadFunc mFunction;