首页 > 学院 > 开发设计 > 正文

[code-design]TvServer 之 CRtk

2019-11-06 09:39:12
字体:
来源:转载
供稿:网友

Record the good designing of code architecture TvServer of CRtk[real time kernel]. it’s mainly introduce how to create/abort thread, msgq send/receive, sem lock/unlock.

create/abort threadvoid CRtk::Halt(void){ for(int i = 0; i < MAX_THREADS; i++) if(m_threads[i] != NULL) m_threads[i]->Halt();}int CRtk::TaskCreate(char * name,int PRiority,int stacksize,FunctionInt entry,int param){ int ret = 0; IRunnable *r = reinterpret_cast<IRunnable*>(entry); for(int i = 0; i < MAX_THREADS; i++) { if(!m_threads[i]) { ret = i; m_threads[i] = new CRunOnce(); //assert(m_threads[i]); m_threads[i]->Post(r,false,NULL,0); break; } } return ret;}msgq create, send/receive msgint CRtk::MsgQCreate(int maxmsg,int maxmsglength){ int ret = 0; for(int i = 0; i < MAX_QS; i++) { if(!m_qs[i]) { ret = i; m_qs[i] = new CMsgQueue(maxmsglength,maxmsg); //assert(m_qs[i]); break; } } return ret;}Bool CRtk::MsgQSend(int msgq,Address buffer,int length,int timeout){ Bool ret = 0; if((msgq < MAX_QS) && (m_qs[msgq])) ret = (Bool)m_qs[msgq]->Send(buffer); return ret;}int CRtk::MsgQReceive(int msgq,Address buffer,int maxlength,int timeout){ int ret = 0; if((msgq < MAX_QS) && (m_qs[msgq])) { m_qs[msgq]->Receive(buffer); ret = 1; } return ret;}Semaphore Semaphore CRtk::SemCreate( void ) { if(mtx_count < 100) { if (pthread_mutex_init(&m_mtxs[mtx_count], NULL) == 0) { return &m_mtxs[mtx_count++]; } } else { ASSERT(FALSE); } return NULL; }void CRtk::SemAcquire( Semaphore sem ) { pthread_mutex_lock((pthread_mutex_t *)sem);}void CRtk::SemRelease( Semaphore sem ) { pthread_mutex_unlock((pthread_mutex_t *)sem);}void CRtk::SemDelete( Semaphore sem ) { pthread_mutex_destroy ((pthread_mutex_t *)sem);}JNI Used for create multiple thread.static javaVM* mVm = NULL;extern "C" jint JNI_OnLoad(JavaVM* vm, void* p){ JNIEnv* env = NULL; jint result = -1; ; mVm = vm; if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { ; } result = JNI_VERSION_1_4; return result;}void TvServerService_attachThread(){ JNIEnv *g_env; if (mVm != NULL) { // double check it's all ok int getEnvStat = mVm->GetEnv((void **)&g_env, JNI_VERSION_1_4); if (getEnvStat == JNI_EDETACHED) { ; if (mVm->AttachCurrentThread(&g_env, NULL) != 0) { ; } } else if (getEnvStat == JNI_OK) { // } else if (getEnvStat == JNI_EVERSION) { } }}void TvServerService_detachThread(){ JNIEnv *g_env; if (mVm != NULL) { // double check it's all ok int getEnvStat = mVm->GetEnv((void **)&g_env, JNI_VERSION_1_4); if (getEnvStat == JNI_EDETACHED) { } else if (getEnvStat == JNI_OK) { ; if (mVm->DetachCurrentThread() != 0) { ; } } else if (getEnvStat == JNI_EVERSION) { } }}destructor CRtk::~CRtk(){ for(int i = 0; i < MAX_QS; i++) if(m_qs[i]) delete m_qs[i]; for(int i = 0; i < MAX_THREADS; i++) if(m_threads[i]) delete m_threads[i]; for (int i = 0; i < mtx_count; i++) { pthread_mutex_destroy (&m_mtxs[i]); }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表