mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-05 17:16:50 +08:00
[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:
@@ -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);
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user