zoukankan      html  css  js  c++  java
  • 一个包的net到gs流程

    再来看看一个包走共享内存的流程
    先来看看net进程这块如何处理的
    {//用shareData这种类型封装刚才从无锁队列中取到的包
        shareData sd;
        sd.channel_id    = pkt.channel_id;
        sd.data            = pkt.data;
        sd.is_data        = pkt.is_data;
        sd.size            = pkt.size;
        auto hr = m_spShareMemInter->pushA(sd);//将这个包放入共享内存中
    }
    //具体看下是如何放入共享内存的
    bool shareMemInterOneway::pushIn(shareData sd)
    {
        scoped_lock<interprocess_mutex> lock(m_mem镜像->mutex);//需要加进程锁,不同进程访问
    
        shareDataEx sd2;
        bool hr = m_ProcessMemPool.getPkt(sd.size, sd2);
        if(!hr)
            return false;
        
        sd2.size        = sd.size;
        sd2.channel_id    = sd.channel_id;
        sd2.is_data        = sd.is_data;
        if(sd.is_data)
        {
            memcpy(sd2.data, sd.data, sd.size);
        }
    
        m_ShareMemQue->push_back(sd2);
        return true;
    
    }
    
    bool ProcessMemPoolEx::getPkt(int len, shareDataEx& sd)
    {
        if(len < 100)//根据长度判断从哪种共享内存中取
            return m_ProcessMemPool0.getPkt(len, sd);
        else if(len < 1000)
            return m_ProcessMemPool1.getPkt(len, sd);
        
        return m_ProcessMemPool2.getPkt(len, sd);
    }
    
    bool ProcessMemPool::getPkt(int len, shareDataEx& sd)
    {
        if(len > m_memSize)
        {
            //测试
            wchar_t tips[50] = {0};
            wsprintf(tips, L"Warning100o: len:%d, memSize:%d!", len, m_memSize);
            MessageBox(NULL, tips/*L"100o"*/, L"1ooo", MB_OK);
            return false;
        }
    
        if(!m_queue->size())
            return false;
    
        sd = m_queue->front();//看到这个就应该知道为什么要初始化那个共享的队列
        m_queue->pop_front();
        sd.data = convertAdd(sd.index);
        return true;
    }
    void* ProcessMemPool::convertAdd(int index)
    {
        return (char*)m_start_addr + (index * m_memSize);//正好通过这个index获取共享内存池的相应地址
    }
    
    附:m_queue初始化代码:
    {
        for (int i = 0; i < m_buffer_num; i++)
        {
            shareDataEx sd;
            sd.index = i;//正是用这个index代表了内存池的哪一块
            sd.size = 0;
            sd.total_size = m_memSize;
            m_queue->push_back(sd);
        }
    }
    
    bool shareMemInterOneway::pushIn(shareData sd)
    {
        scoped_lock<interprocess_mutex> lock(m_mem镜像->mutex);
    
        shareDataEx sd2;
        bool hr = m_ProcessMemPool.getPkt(sd.size, sd2);//在调用Getpkt之后就会获得一块内存的地址
        if(!hr)
            return false;
        
        sd2.size        = sd.size;
        sd2.channel_id    = sd.channel_id;
        sd2.is_data        = sd.is_data;
        if(sd.is_data)
        {
            memcpy(sd2.data, sd.data, sd.size);//然后就将传递进来的sd内存复制到共享内存中的内存池,而sd中的这个内存就是那个m_recvBuff里面的,有个问题就是这个m_recvBuff为什么要分配100m的内存,需要这么大么?
        }
    
        m_ShareMemQue->push_back(sd2);//然后他将这个sd2放到放到交互的共享队列中,注意这里面的内存还是分配在共享内存池中的,m_ShareMemQue中只是保存了一个地址而已
        return true;
    
    }//这样一个包就放入共享的队列中了
  • 相关阅读:
    BZOJ 1818: [Cqoi2010]内部白点 扫描线+树状数组
    BZOJ 2091: [Poi2010]The Minima Game 博弈dp
    BZOJ 4459: [Jsoi2013]丢番图 数学推导
    BZOJ 3561: DZY Loves Math VI 莫比乌斯反演+复杂度分析
    BZOJ 3048: [Usaco2013 Jan]Cow Lineup 双指针
    PAT Basic 1012 数字分类 (20 分)
    PAT Basic 1008 数组元素循环右移问题 (20 分)
    大数据数据库HBase(一)——架构原理
    PAT Basic 1046 划拳 (15 分)
    PAT Basic 1026 程序运行时间 (15 分)
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4084295.html
Copyright © 2011-2022 走看看