windows平台内存缓冲池

#ifndef HBUFFER_HPP
#define HBUFFER_HPP


#include <deque>
#include <algorithm>
using std::deque;


class HBuff
{
public:
    inline void IncPtr(void **p,int i)
    {  
        *p = (void*)((int)*p + i);
    }
    HBuff(long buf_count,long buf_size)
        :m_buf_count(buf_count),m_buf_size(buf_size)
    {
        m_lock = new RTL_CRITICAL_SECTION;
        InitializeCriticalSection(m_lock);
        m_buf = malloc(buf_count * buf_size);
        memset(m_buf,0,buf_count * buf_size);
        m_buf_end = (unsigned long)m_buf + (buf_count *  buf_size);
        m_buf_free = new void*[buf_count];        
        void *p = m_buf;
        for(int i=0;i<buf_count;++i)
        {
            m_buf_free[i] = p;
            IncPtr(&p,buf_size);
        }
        m_buf_free_pos = buf_count - 1;       
    }
    ~HBuff()
    {
        ::free(m_buf);
        delete [] m_buf_free;   
        DeleteCriticalSection(m_lock);
        delete m_lock;
    }
    void *GetBuf()
    {
        AutoCriticalSection auto1(*m_lock);        
        --m_buf_free_pos;
        if(m_buf_free_pos < -1)
        {
            ++m_buf_free_pos;
            void *ret = malloc(m_buf_size);
            memset(ret,0,m_buf_size);
            m_buf_busy.push_back(ret);
            return ret;
        }
        else
        {
            void* ret = m_buf_free[m_buf_free_pos+1];
            m_buf_busy.push_back(ret);
            return ret;
        }
    }
    void FreeBuf(void *buf)
    {
        AutoCriticalSection auto1(*m_lock);
        deque<void*>::iterator it = std::find(m_buf_busy.begin(),m_buf_busy.end(),buf);
        if(m_buf_busy.end() == it)
            return;
        m_buf_busy.erase(it);
        if((unsigned long)buf >= m_buf_end || (unsigned long)buf < (unsigned long)m_buf)
        {
            ::free(buf);
        }
        else
        {
            ++m_buf_free_pos;
            m_buf_free[m_buf_free_pos] = buf;            
        }
    }
private:
    HBuff(const HBuff&);
    HBuff& operator=(const HBuff&);
private:
    long    m_buf_count;
    long    m_buf_size;
    unsigned long m_buf_end;
    void*   m_buf;
    void**  m_buf_free;
    deque<void*>  m_buf_busy;
    long volatile m_buf_free_pos;   
    RTL_CRITICAL_SECTION *m_lock;
};


#endif
发布了38 篇原创文章 · 获赞 19 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/truexf/article/details/38779077