现在的位置: 首页 > 综合 > 正文

MemMan 3 beta

2012年05月19日 ⁄ 综合 ⁄ 共 5166字 ⁄ 字号 评论关闭

 

/**************************************************
 *
 * MemMan 3.0.0.0 beta
 *
 * Copyright (C) 2007 - 2008 by Len3d
 * All rights reserved.
 *
 ************************************************
*/


#ifndef __MEM_MAN__
#define __MEM_MAN__

#include 
<vector>
#include 
<algorithm>
#include 
<malloc.h>

#pragma pack(push,
1)

namespace mem {

    
#define mem_inline        __forceinline

    
#define    mem_page_size    ( 1 << 18 )
    
#define mem_align_size    16
    
#define mem_align        __declspec( align( mem_align_size ) )

    typedef unsigned 
int    prior_type;
    typedef unsigned 
long    time_type;
    typedef unsigned 
long    size_type;
    typedef unsigned 
char    byte;

    
#define mem_max( a, b )    ( ( (a) > (b) ) ? (a) : (b) )
    
#define mem_min( a, b )    ( ( (a) < (b) ) ? (a) : (b) )

    
enum {
        ENTRY_PRIORITY 
= 0,
    }
;

    
class heap {
    
public:
        mem_inline heap( size_type max_size )
        
{
            allocated_size 
= 0;
            available_size 
= max_size;
        }


        mem_inline 
~heap()
        
{
        }


        mem_inline 
void *alloc( size_type size )
        
{
            
if( size == 0 )
                
return NULL;

            allocated_size 
+= size;
            available_size 
-= size;

            
return sys_alloc( size );
        }


        mem_inline 
void dealloc( void *ptr, size_type size )
        
{
            
if( ptr && size != 0 )
            
{
                sys_dealloc( ptr );

                allocated_size 
-= size;
                available_size 
+= size;
            }

        }


        mem_inline 
void *aligned_alloc( size_type size )
        
{
            
if( size == 0 )
                
return NULL;

            allocated_size 
+= size;
            available_size 
-= size;

            
return sys_aligned_alloc( size );
        }


        mem_inline 
void aligned_dealloc( void *ptr, size_type size )
        
{
            
if( ptr && size != 0 )
            
{
                sys_aligned_dealloc( ptr );

                allocated_size 
-= size;
                available_size 
+= size;
            }

        }


        mem_inline size_type available()
        
{
            
return available_size;
        }


    
private:
        mem_inline 
void *sys_alloc( size_type size )
        
{
            
return malloc( size );
        }


        mem_inline 
void sys_dealloc( void *ptr )
        
{
            free( ptr );
        }


        mem_inline 
void *sys_aligned_alloc( size_type size )
        
{
            
return _aligned_malloc( size, mem_align_size );
        }


        mem_inline 
void sys_aligned_dealloc( void *ptr )
        
{
            _aligned_free( ptr );
        }


    
private:
        size_type        allocated_size, 
                        available_size;
    }
;

    
extern heap        *g_heap;

    
class allocator {
    
public:
        mem_inline 
void *alloc( size_type size )
        
{
            
return g_heap->alloc( size );
        }


        mem_inline 
void dealloc( void *ptr, size_type size )
        
{
            g_heap
->dealloc( ptr, size );
        }


        mem_inline size_type available()
        
{
            
return g_heap->available();
        }

    }
;

    
class aligned_allocator {
    
public:
        mem_inline 
void *alloc( size_type size )
        
{
            
return g_heap->aligned_alloc( size );
        }


        mem_inline 
void dealloc( void *ptr, size_type size )
        
{
            g_heap
->aligned_dealloc( ptr, size );
        }


        mem_inline size_type available()
        
{
            
return g_heap->available();
        }

    }
;

    template 
< typename ALLOC = allocator > class pool;

    template 
< typename ALLOC = allocator >
    
class entry {
    
public:
        mem_inline entry()
        
{
            priority 
= ENTRY_PRIORITY;
            last_use_time 
= pl.get_current_time();
            locked 
= false;
        }

        
        mem_inline 
virtual ~entry()
        
{
        }


        mem_inline 
void *alloc( size_type size )
        
{
            
return pl.alloc( size, this );
        }


        mem_inline 
void dealloc( void *ptr, size_type size )
        
{
            pl.dealloc( ptr, size, 
this );
        }


        mem_inline 
void stream_begin()
        
{
            locked 
= true;
            stream_in();
            last_use_time 
= pl.get_current_time();
        }


        mem_inline 
void stream_end()
        
{
            locked 
= false;
        }


        mem_inline 
bool is_locked()
        
{
            
return locked;
        }


        mem_inline 
bool operator < ( const entry< ALLOC > & right ) const
        
{
            
if( priority == right.priority )
                
return ( last_use_time < right.last_use_time );
            
else
                
return ( priority < right.priority );
        }


    
public:
#ifdef _DEBUG
        
virtual void stream_in() = 0;
#endif

        
virtual bool stream_out( void * & ptr, size_type size ) = 0;

    
public:
        
static pool< ALLOC >    pl;
        prior_type                priority;
        time_type                last_use_time;
        
bool                    locked;
    }
;

    template 
< typename ALLOC >
    mem_inline 
bool compare_entry( const entry< ALLOC > *left, const entry< ALLOC > *right )
    
{
        
return ( *left < *right );
    }


    template 
< typename ALLOC >
    
class pool {
    
private:
        
class page {
        
public:

抱歉!评论已关闭.