[code-design]TvServer 之 CRtk

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.

  1. create/abort thread
void 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;
}
  1. msgq create, send/receive msg
int 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;
}
  1. 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);
}
  1. 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) {
         }
    }
}
  1. 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]);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章