void clMsgQueueFree(ClMsgQueueInfoT *pQInfo)
{
    ClRcT rc = CL_OK;
    SaNameT qName = {strlen("--Unknow--"), "--Unknow--"};
    ClUint32T i;

    CL_OSAL_MUTEX_LOCK(&pQInfo->qLock);

    (void)clMsgUnblockThreadsOfQueue(pQInfo);

    if(pQInfo->unlinkFlag == CL_FALSE && pQInfo->pQueueEntry != NULL)
    {
        saNameCopy(&qName, &pQInfo->pQueueEntry->qName);
    }
    
    if(pQInfo->timerHandle != 0)
    {
        rc = clTimerDelete(&pQInfo->timerHandle);
        if(rc != CL_OK)
            clLogError("QUE", "FREE", "Failed to delete [%.*s]'s timer handle. error code [0x%x].", 
                       qName.length, qName.value, rc);
    }
    
    clMsgQueueEmpty(pQInfo);

    for(i = 0; i < CL_MSG_QUEUE_PRIORITIES ; i++)
    {
        rc = clCntDelete(pQInfo->pPriorityContainer[i]);
        if(rc != CL_OK)
            clLogError("QUE", "FREE", "Failed to delete the [%.*s]'s [%d] priority container. error code [0x%x].", 
                       qName.length, qName.value, i, rc);
        else
            pQInfo->pPriorityContainer[i] = 0;
    }

    rc = clOsalCondDelete(pQInfo->qCondVar);
    if(rc != CL_OK)
        clLogError("QUE",  "FREE", "Failed to delete the [%.*s]'s condtional variable. error code [0x%x].",
                   qName.length, qName.value, rc);

    pQInfo->qCondVar = 0;

    CL_OSAL_MUTEX_UNLOCK(&pQInfo->qLock);

    rc = clOsalMutexDestroy(&pQInfo->qLock);
    if(rc != CL_OK)
        clLogError("QUE",  "FREE", "Failed to delete the [%.*s]'s lock. error code [0x%x].",
                   qName.length, qName.value, rc);

    clLogDebug("QUE", "FREE", "Freed the queue [%.*s].", qName.length, qName.value);

    return;
}
ClRcT clMsgFinalizeBlockFin(void)
{
    ClRcT rc;
    
    rc = clMsgEventFinalize();
    if(rc != CL_OK)
        clLogError("MSG", "BLOCK", "Failed to finalize event library. error code [0x%x].", rc);

    rc = clOsalMutexDestroy(&gFinBlockMutex);
    if(rc != CL_OK)
        clLogError("MSG", "BLOCK", "Failed to delete a mutex. error code [0x%x].", rc);

    rc = clOsalCondDelete(gFinBlockCond);
    if(rc != CL_OK)
        clLogError("MSG", "BLOCK", "Failed to delete a conditional variable. error code [0x%x].", rc);

    return rc;
}
ClRcT clMsgFinalizeBlockInit(void)
{
    ClRcT rc;
    ClRcT retCode;

    rc = clOsalCondCreate(&gFinBlockCond);
    if(rc != CL_OK)
    {   
        clLogError("FIN", "BLOCK", "Failed to create a condtional variable. error code [0x%x].", rc);
        goto error_out;
    } 

    rc = clOsalMutexInit(&gFinBlockMutex);
    if(rc != CL_OK)
    {
        clLogError("FIN", "BLOCK", "Failed to create a mutex. error code [0x%x].", rc);
        goto error_out_1;
    } 

    rc = clMsgEventInitTimerStart();
    if(rc != CL_OK)
    {
        clLogError("FIN", "BLOCK", "Failed to start event initialize timer. error code [0x%x].", rc);
        goto error_out_2;
    }

    goto out;

error_out_2:
    retCode = clOsalMutexDestroy(&gFinBlockMutex);
    if(retCode != CL_OK)
        clLogError("MSG", "BLOCK", "Failed to destroy mutex. error code [0x%x].", retCode);
error_out_1:
    retCode = clOsalCondDelete(gFinBlockCond);
    if(retCode != CL_OK)
        clLogError("MSG", "BLOCK", "Failed to delete a conditional variable. error code [0x%x].", retCode);
error_out:
out:
    return rc;
}