midp事件的存储和获取

来源:互联网 发布:mac jenkins安装路径 编辑:程序博客网 时间:2024/06/08 07:10

//midp事件的存储和获取


// 类似消费者

// 获取MIDP事件,保存在pResult中;返回未处理的MIDP事件个数
static int
getPendingMIDPEvent(MidpEvent* pResult, int isolateId)
{
    // 获取Isolate对应的等待事件队列
    // 在MVM模式下,每个Isolate有1个等待事件队列
    // 在SVM模式下,有1个等待事件队列
    EventQueue* pEventQueue = getIsolateEventQueue(isolateId);

    // 队列中的事件个数为0时
    if (pEventQueue->numEvents == 0)
    {
        return -1;
    }

    // 队列中有事件时,取出队列当前尾部的这个事件
    *pResult = pEventQueue->events[pEventQueue->eventOut];

    // 取出事件后,对该队列位置元素值进行重新初始化
    /* Empty out the events so we do not free it when finalizing. */
    MIDP_EVENT_INITIALIZE(pEventQueue->events[pEventQueue->eventOut]);

    // 事件计数减1
    pEventQueue->numEvents--;
    // 取事件位置向后挪一个元素
    pEventQueue->eventOut++;
    // 循环队列,到达最大个数后,回到初始位置
    if (pEventQueue->eventOut == MAX_EVENTS)
    {
         /* This is a circular queue, so start back at zero. */
        pEventQueue->eventOut = 0;
    }

    // 返回队列当前的事件个数
    return pEventQueue->numEvents;
}



// 类似生产者
// 把MIDP事件保存到isolateId对应的事件队列中去
static void StoreMIDPEventInVmThreadImp(MidpEvent event, int isolateId)
{
    EventQueue* pEventQueue;
    JVMSPI_ThreadID thread;

    pEventQueue = getIsolateEventQueue(isolateId);

    midp_logThreadId("StoreMIDPEventInVmThread");

    // 临界区,加锁
    midp_waitAndLockEventQueue();

    // 事件队列未满,可继续存储事件
    if (pEventQueue->numEvents != MAX_EVENTS)
    {
        pEventQueue->events[pEventQueue->eventIn] = event;
        pEventQueue->eventIn++;
        if (pEventQueue->eventIn == MAX_EVENTS) {
            /* This is a circular queue, so start back at zero. */
            pEventQueue->eventIn = 0;
        }
      
        pEventQueue->numEvents++;

        if (pEventQueue->isMonitorBlocked)
        {    
            /*
            * The event monitor thread has been saved as the "special" thread
            * of this particular isolate in order to avoid having to search
            * the entire list of threads.
            */
            thread = SNI_GetSpecialThread(isolateId);
            
            /* check and align stack suspend/resume state */
            // midp_checkAndResume();
            
            if (thread != NULL)
            {    
                midp_thread_unblock(thread);
                pEventQueue->isMonitorBlocked = KNI_FALSE;
            }
            else
            {
                REPORT_CRIT(LC_CORE,
                    "StoreMIDPEventInVmThread: cannot find "
                    "native event monitor thread");
            }
        }
    }
    // 事件队列已满,此时发过来的事件将被丢弃!
    else
    {
        /*
        * Ignore the event; there is no space to store it.
        * IMPL NOTE: this should be fixed, or it should be a fatal error;
        * dropping an event can lead to a full system deadlock.
        */
        REPORT_CRIT1(LC_CORE,"**event queue %d full, dropping event",isolateId);
    }

    midp_unlockEventQueue();
}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 澳洲留学挂科签证续签怎么办 澳洲旅游签证被拒了怎么办 学校六级不让刷分怎么办 英国留学生怎么办申根签证 挂科太多拿不到学位证怎么办 ucl语言班没过怎么办 西澳大学工程挂科怎么办 澳洲语言班没过怎么办2018 杨浦区对口公立小学太差怎么办 公立小学太差了怎么办 澳大利亚出国留学怎么办-语言课程 学校不给释放信怎么办 重修费交不起钱怎么办 不想用家里的钱怎么办 三本学费太贵怎么办 从日本往中国汇款怎么办 学费钱大一没交怎么办 初中孩子和同学相处不好怎么办 使用假护照出国被发现怎么办 酒店忘记退房了怎么办 语言课申请不上怎么办 学会计的应届生想转行怎么办 上班熬不下去了怎么办 墨大选修挂科怎么办 日本签证年收入没有10w怎么办 做生意的办房贷没有薪资流水怎么办 澳洲医保卡丢了怎么办 澳洲爱他美上火怎么办 学信网学籍在籍没交学费怎么办 宝宝从床上摔下来怎么办 狗没打针被咬了怎么办 狗咬了没破皮没出血怎么办 被宠物狗咬了出血了怎么办 让狗咬了下红了怎么办 狗牙齿碰到红了怎么办 加拿大学生签背景调查了怎么办 gpa不到3该怎么办英国 内地学生赴港签证怎么办 学生去日本旅游签证怎么办 澳洲未婚妻签需要单身证明怎么办 高院收到申诉材料怎么办?