⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queue.c

📁 MTK手机平台的MMI部分的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    }
#ifdef __MMI_FILE_MANAGER__    
    else if (oslMessage->oslSrcId == MOD_MMI &&
             oslMessage->oslDestId == MOD_FMT)
    {
        oslMessage->sap_id = MMI_FMT_SAP;
    }
#endif
    else if (oslMessage->oslSrcId == MOD_MMI &&
             oslMessage->oslDestId == MOD_ABM)
    {
        oslMessage->sap_id = MMI_ABM_SAP;
    }
    else if (oslMessage->oslSrcId == MOD_MMI &&
             oslMessage->oslDestId == MOD_J2ME)
    {
        oslMessage->sap_id = MMI_J2ME_SAP;
    }
    else if (oslMessage->oslSrcId == MOD_MMI &&
             oslMessage->oslDestId == MOD_JASYN)
    {
        oslMessage->sap_id = MMI_JASYN_SAP;
    }
    else if (oslMessage->oslSrcId == MOD_MMI &&
             oslMessage->oslDestId == MOD_SYNCML)
    {
        oslMessage->sap_id = MMI_SYNCML_SAP;
    }
    else if (oslMessage->oslSrcId == MOD_MMI &&
             oslMessage->oslDestId == MOD_POC)
    {
        oslMessage->sap_id = MMI_POC_SAP;
    }
    else if (oslMessage->oslSrcId == MOD_MMI &&
             oslMessage->oslDestId == MOD_WAP)
    {
        oslMessage->sap_id = MMI_WAP_SAP;
    }
    else if (oslMessage->oslSrcId == MOD_WAP &&
             oslMessage->oslDestId == MOD_MMI)
    {
        oslMessage->sap_id = WAP_MMI_SAP;
    }
    else
    {
        oslMessage->sap_id = INVALID_SAP;
    }
    msg_send_ext_queue(oslMessage);
    CheckAndPrintMsgId((U16) (Message->msg_id));
#else /* MMI_ON_WIN32 */ 
    if (Message->oslDestId == MOD_MMI)
    {
        Message->oslDestId = MOD_PRT;
    }
    if (Message->oslSrcId == MOD_MMI)
    {
        Message->oslSrcId = MOD_PRT;
    }
    if (Message->oslDestId == MOD_WAP)
    {
        Message->oslDestId = MOD_PRT;
    }
    
    /* make sure destination module exists */
    MMI_ASSERT( Message->oslDestId < TOTAL_TASKS );
    
    OslIntWriteMsgQ(task_info_g1[Message->oslDestId].task_ext_qid, Message, sizeof(MYQUEUE), OSL_INFINITE_WAIT);
#endif /* MMI_ON_WIN32 */ 
}


/*****************************************************************************
 * FUNCTION
 *  OslIntConstructDataPtr
 * DESCRIPTION
 *  Constructs Data Ptr
 *  
 *  Not used now
 * PARAMETERS
 *  size        [IN]        
 * RETURNS
 *  void
 *****************************************************************************/
void *OslIntConstructDataPtr(U32 size)
{
#ifndef MMI_ON_WIN32
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    return (construct_local_para((kal_uint16) size, TD_CTRL));
#else /* MMI_ON_WIN32 */ 
    void *ptr;
    TSIZE *temp, tempdata;

    temp = OslMalloc(size + sizeof(tempdata));
    assert(temp != NULL);

    tempdata.s = size;
    memcpy(temp, &tempdata, sizeof(tempdata));
    ptr = (void*)((char*)temp + sizeof(tempdata));
    return ptr;
#endif /* MMI_ON_WIN32 */ 

}


/*****************************************************************************
 * FUNCTION
 *  OslIntFreeDataPtr
 * DESCRIPTION
 *  Frees Data Ptr
 *  
 *  Not used now
 * PARAMETERS
 *  ptr     [?]     
 * RETURNS
 *  void
 *****************************************************************************/
void OslIntFreeDataPtr(void *ptr)
{
#ifndef MMI_ON_WIN32
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    free_local_para(ptr);
#else /* MMI_ON_WIN32 */ 
    TSIZE *temp;

    temp = (void*)((char*)ptr - sizeof(TSIZE));
    OslMfree(temp);
#endif /* MMI_ON_WIN32 */ 
}


/*****************************************************************************
 * FUNCTION
 *  OslIntSizeofDataPtr
 * DESCRIPTION
 *  Returns Size of Data Ptr
 *  
 *  Not used now
 * PARAMETERS
 *  ptr     [?]     
 * RETURNS
 *  void
 *****************************************************************************/
U32 OslIntSizeofDataPtr(void *ptr)
{
#ifndef MMI_ON_WIN32
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    struct tsize
    {
        U8 ref_count;
        U16 size;

        /*----------------------------------------------------------------*/
        /* Code Body                                                      */
        /*----------------------------------------------------------------*/
    };

    return 0;
#else /* MMI_ON_WIN32 */ 
    typedef struct tsize
    {
        U32 size;
    } TSIZE;
    TSIZE *temp;

    if (ptr == NULL)
    {
        return 0;
    }
    temp = (void*)((char*)ptr - sizeof(TSIZE));
    return (U32) temp->size;
#endif /* MMI_ON_WIN32 */ 
}


/*****************************************************************************
 * FUNCTION
 *  OslIntFreeInterTaskMsg
 * DESCRIPTION
 *  Frees InterTask Mesg
 *  
 *  Not used now
 * PARAMETERS
 *  Message     [?]     
 * RETURNS
 *  void
 *****************************************************************************/
void OslIntFreeInterTaskMsg(void *Message)
{
#ifndef MMI_ON_WIN32
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    free_ilm(Message);
#else /* MMI_ON_WIN32 */ 

    MYQUEUE *ptr;

    ptr = Message;
    if (ptr->oslSrcId == MOD_L4C)
    {
        ptr->oslSrcId = MOD_MMI;
        ptr->oslDestId = MOD_L4C;

        ptr->oslMsgId = 0;
        OslMsgSendExtQueue(ptr);
    }
    else
    {
        if (ptr->oslDataPtr != NULL)
        {
            OslIntFreeDataPtr(ptr->oslDataPtr);
        }
    }
#endif /* MMI_ON_WIN32 */ 
}

#ifdef MMI_ON_WIN32


/*****************************************************************************
 * FUNCTION
 *  OslNumOfQMsgs
 * DESCRIPTION
 *  Get the message number in MMI queue
 * PARAMETERS
 *  void
 * RETURNS
 *  message number
 *****************************************************************************/
U8 OslNumOfQMsgs(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    U8 num;
    oslMsgqid msgqid = task_info_g1[MOD_PRT].task_ext_qid;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    EnterCriticalSection(&msgqid->q_cs);
    num = (U8) (msgqid->q_messages);
    LeaveCriticalSection(&msgqid->q_cs);
    return num;
}

#endif /* MMI_ON_WIN32 */ 
#define CIRCQ_NODE_SIZE sizeof(MYQUEUE)

/* 
 * Because MMI task will receive extQ message into circular queue,
 * we increase the circular queue size from 30 to 50
 */
#define CIRCQ_NO_OF_NODES 65

__align(4)
     U8 circq_array[CIRCQ_NODE_SIZE * CIRCQ_NO_OF_NODES];
     U8 circq_read = 0, circq_write = 0, circq_messages = 0, max_circq_messages = 0;


/*****************************************************************************
 * FUNCTION
 *  OslReadCircularQ
 * DESCRIPTION
 *  Reads from Circ Queue
 *  
 *  Not used now
 * PARAMETERS
 *  msgPtr      [?]     
 * RETURNS
 *  void
 *****************************************************************************/
     U8 OslReadCircularQ(void *msgPtr)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    PRINT_INFORMATION_2((MMI_TRACE_G1_FRM, "OslReadCircularQ: <#[%d], read:[%d], write:[%d]>", circq_messages,
                         circq_read, circq_write));
    if (circq_messages == 0)
    {
        return 0;
    }
    memcpy(msgPtr, circq_array + (circq_read * CIRCQ_NODE_SIZE), CIRCQ_NODE_SIZE);
    if (++circq_read == CIRCQ_NO_OF_NODES)
    {
        circq_read = 0;
    }
    --circq_messages;
    return 1;
}


/*****************************************************************************
 * FUNCTION
 *  OslLookUpLastCircularQMsg
 * DESCRIPTION
 *  Look up the last message in Circ Queue
 *  
 *  Not used now
 * PARAMETERS
 *  msgPtr      [?]     
 * RETURNS
 *  void
 *****************************************************************************/
U8 OslLookUpLastCircularQMsg(void *msgPtr)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    U16 last_read_index;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (circq_messages > 0)
    {
        if (circq_write == 0)
        {
            last_read_index = CIRCQ_NO_OF_NODES;
        }
        else
        {
            last_read_index = circq_write - 1;
        }
        memcpy(msgPtr, circq_array + (last_read_index * CIRCQ_NODE_SIZE), CIRCQ_NODE_SIZE);
        return 1;
    }
    else
    {
        memset(msgPtr, 0, CIRCQ_NODE_SIZE);
        return 0;
    }
}


/*****************************************************************************
 * FUNCTION
 *  OslWriteCircularQ
 * DESCRIPTION
 *  Writes to Circ Queue
 *  
 *  Not used now
 * PARAMETERS
 *  msgPtr      [?]     
 * RETURNS
 *  void
 *****************************************************************************/
U8 OslWriteCircularQ(void *msgPtr)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    PRINT_INFORMATION_2((MMI_TRACE_G1_FRM, "OslWriteCircularQ: <#[%d], read:[%d], write:[%d]>", circq_messages,
                         circq_read, circq_write));
    if (circq_messages == CIRCQ_NO_OF_NODES)
    {
        MMI_ASSERT(0);
        return 0;
    }
    memcpy(circq_array + (circq_write * CIRCQ_NODE_SIZE), msgPtr, CIRCQ_NODE_SIZE);
    if (++circq_write == CIRCQ_NO_OF_NODES)
    {
        circq_write = 0;
    }
    ++circq_messages;
    if (max_circq_messages < circq_messages)
    {
        max_circq_messages = circq_messages;
    }
    return 1;
}


/*****************************************************************************
 * FUNCTION
 *  OslNumOfCircularQMsgs
 * DESCRIPTION
 *  Get the message number
 *  
 *  Not used now
 * PARAMETERS
 *  void
 * RETURNS
 *  void
 *****************************************************************************/
U8 OslNumOfCircularQMsgs(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    return circq_messages;
}


/*****************************************************************************
 * FUNCTION
 *  OslIsCircularQFull
 * DESCRIPTION
 *  Check if Circ Queue is full
 *  
 *  Not used now
 * PARAMETERS
 *  void
 * RETURNS
 *  void
 *****************************************************************************/
U8 OslIsCircularQFull(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    return (circq_messages == CIRCQ_NO_OF_NODES);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -