#ifndef __CUVTHREAD__H_
#define __CUVTHREAD__H_
#include "uv.h"
#include "UvSem.h"
#include "CLogmanager.h"
class CUvThread{
public:
CUvThread();
virtual ~CUvThread();
public:
int Start();
int Quit();
void Wait();
void Activate();
public:
static void ThreadEntry(void *pParam);
protected:
virtual int OnThreadRun() = 0;
virtual int OnCreate();
virtual int OnQuit();
virtual int OnDestroy();
protected:
bool mbQuit;
private:
uv_thread_t mstThread;
CUvSem mcUvSem;
bool m_bInit;
};
#endif
#include "UvThread.h"
CUvThread::CUvThread(){
m_bInit = false;
mbQuit = false;
}
CUvThread::~CUvThread(){
Quit();
}
void CUvThread::ThreadEntry(void *pParam) {
if (nullptr != pParam) {
CUvThread* pUvThread = reinterpret_cast<CUvThread*>(pParam);
if (nullptr != pUvThread) {
pUvThread->m_bInit = true;
pUvThread->OnThreadRun();
pUvThread->OnQuit();
}
}
}
int CUvThread::Start() {
ASSERT_RET_VALUE(m_bInit == false, 1);
OnCreate();
if (uv_thread_create(&mstThread, CUvThread::ThreadEntry, (void*)this) != 0){
LOG_ERR("uv_thread_create error");
return 1;
}
while (!m_bInit) {
sleep_ms(10);
}
return 0;
}
int CUvThread::Quit() {
mbQuit = true;
if (m_bInit) {
uv_thread_join(&mstThread);
m_bInit = false;
return OnDestroy();
}
return 0;
}
int CUvThread::OnCreate() {
LOG_INFO("Enter CUvThread::OnCreate");
return 0;
}
int CUvThread::OnQuit() {
LOG_INFO("Enter CUvThread::OnQuit");
return 0;
}
int CUvThread::OnDestroy() {
LOG_INFO("Enter CUvThread::OnDestroy");
return 0;
}
void CUvThread::Wait() {
mcUvSem.Wait();
}
void CUvThread::Activate() {
mcUvSem.Post();
}