时间: 2020-11-21|10次围观|0 条评论

MemMan 1.0.0.1 Released!
MemMan 1.0.0.1 Released!插图
MemMan 1.0.0.1 Released!插图1
/**/
/**************************************************
MemMan 1.0.0.1 Released!插图2 *
MemMan 1.0.0.1 Released!插图2 * MemMan 1.0.0.1
MemMan 1.0.0.1 Released!插图2 *
MemMan 1.0.0.1 Released!插图2 * Copyright (C) 2007 - 2008 by Len3d
MemMan 1.0.0.1 Released!插图2 * All rights reserved.
MemMan 1.0.0.1 Released!插图2 *
MemMan 1.0.0.1 Released!插图3 ************************************************
*/


MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4#ifndef __MEM_MAN__
MemMan 1.0.0.1 Released!插图4

#define
 __MEM_MAN__

MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4

#define
 DEFAULT_MEMORY_ALIGN    16        
//
    default memory aligment set to this size

MemMan 1.0.0.1 Released!插图4

#define
 ALIGN_DEF                __declspec( align( DEFAULT_MEMORY_ALIGN ) )

MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4typedef 

int
    (
*
FreeContentFunc)( 
void
 
*
object
, UINT requested_size, UINT 
&
 ref_count );    
//
    can't be member function of a class

MemMan 1.0.0.1 Released!插图4


MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4#pragma pack(push,

1
)
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图MemMan 1.0.0.1 Released!插图1

class
 MemoryAllocator 
MemMan 1.0.0.1 Released!插图5
{        //    memory allocator, takes charge of all system operations, also limits the usage of memory
MemMan 1.0.0.1 Released!插图2
private:
MemMan 1.0.0.1 Released!插图2    typedef UINT    MemoryHeaderBias;    
//    biased value type of memory header
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    
//    elements of the memory priority queue, keep track of all memory blocks
MemMan 1.0.0.1 Released!插图2

MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
class MemoryHeader MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2    
public:
MemMan 1.0.0.1 Released!插图2        FORCEINLINE MemoryHeader( UINT prior, 
void *obj, FreeContentFunc func, UINT al )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            lchild 
= rchild = parent = NULL;
MemMan 1.0.0.1 Released!插图2            priority 
= prior;
MemMan 1.0.0.1 Released!插图2            
object = obj;
MemMan 1.0.0.1 Released!插图2            free_func 
= func;
MemMan 1.0.0.1 Released!插图2            locked 
= TRUE;    //    we lock immediately after allocation
MemMan 1.0.0.1 Released!插图2
            align = al;
MemMan 1.0.0.1 Released!插图2            ref_count 
= 1;    //    assume one block references this header at beginning
MemMan 1.0.0.1 Released!插图2
            bias = sizeof(MemoryHeader);
MemMan 1.0.0.1 Released!插图2            bfact 
= 0;
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2        
//    we don't need a deconstructor for this class
MemMan 1.0.0.1 Released!插图2

MemMan 1.0.0.1 Released!插图2        FORCEINLINE 
void    lock()
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            locked 
= TRUE;
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2        FORCEINLINE 
void    unlock()
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            locked 
= FALSE;
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2        FORCEINLINE 
void    create_child( MemoryHeader *key )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            
if( key->priority < priority )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7            
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                
if( lchild )
MemMan 1.0.0.1 Released!插图2                    lchild
->create_child( key );
MemMan 1.0.0.1 Released!插图2                
else
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7                
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    lchild 
= key;
MemMan 1.0.0.1 Released!插图2                    lchild
->parent = this;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图8            }

MemMan 1.0.0.1 Released!插图2            
else
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7            
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                
if( rchild )
MemMan 1.0.0.1 Released!插图2                    rchild
->create_child( key );
MemMan 1.0.0.1 Released!插图2                
else
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7                
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    rchild 
= key;
MemMan 1.0.0.1 Released!插图2                    rchild
->parent = this;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图8            }

MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2        FORCEINLINE 
bool    search_memory( UINT search_size, int search_align, void * & search_result, 
MemMan 1.0.0.1 Released!插图2                                            
void *obj, FreeContentFunc func )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            
if( lchild && lchild->search_memory( search_size, search_align, search_result, obj, func ) )
MemMan 1.0.0.1 Released!插图2                
return true;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
if( align == search_align && free_content( search_size ) )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7            
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                search_result 
= get_memory();
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                
object = obj;    //    update the attributes of the memory block
MemMan 1.0.0.1 Released!插图2
                free_func = func;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                
return true;
MemMan 1.0.0.1 Released!插图8            }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
if( rchild && rchild->search_memory( search_size, search_align, search_result, obj, func ) )
MemMan 1.0.0.1 Released!插图2                
return true;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
return false;
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2        FORCEINLINE 
void    *get_memory()    //    the allocated memory block
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
        MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            
return ((char *)this + sizeof(MemoryHeader));
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2        FORCEINLINE 
void    dec_ref_count()    //    decrease the reference count
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
        MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            
-- ref_count;
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2        FORCEINLINE UINT    get_ref_count()    
//    the reference count
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
        MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            
return ref_count;
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2        
//    try to free some content of the object for requested size,
MemMan 1.0.0.1 Released!插图2        
//    update the reference count and return the size of the freed memory
MemMan 1.0.0.1 Released!插图2
        FORCEINLINE int        free_content( UINT requested_size )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            
if!locked && free_func && object )
MemMan 1.0.0.1 Released!插图2                
return free_func( object, requested_size, ref_count );
MemMan 1.0.0.1 Released!插图2            
else
MemMan 1.0.0.1 Released!插图2                
return 0;
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    
public:
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        ALIGN_DEF 
struct MemMan 1.0.0.1 Released!插图5{    //    48 Byte aligned including the header bias
MemMan 1.0.0.1 Released!插图2
            MemoryHeader        *lchild,    //    left child, right child and parent
MemMan 1.0.0.1 Released!插图2
                                *rchild,
MemMan 1.0.0.1 Released!插图2                                
*parent;
MemMan 1.0.0.1 Released!插图2            UINT                priority;    
//    priority for sorting the memory blocks
MemMan 1.0.0.1 Released!插图2
            void                *object;    //    the object for which the memory was allocated
MemMan 1.0.0.1 Released!插图2
            FreeContentFunc        free_func;    //    function to free the content of the object for requested size,
MemMan 1.0.0.1 Released!插图2                                            
//    memory blocks without this function will be restored to memory-mapped files.
MemMan 1.0.0.1 Released!插图2
            int                    locked;        //    this memory block was locked by a thread
MemMan 1.0.0.1 Released!插图2
            int                    bfact;        //    balance factor of the AVL tree
MemMan 1.0.0.1 Released!插图2
            UINT                align;        //    aligment of the allocated memory should match
MemMan 1.0.0.1 Released!插图2
            UINT                ref_count;    //    how many blocks reference this header
MemMan 1.0.0.1 Released!插图2
            UINT                pad;        //    padded to 48 Byte, no use
MemMan 1.0.0.1 Released!插图2
            MemoryHeaderBias    bias;        //    the header bias
MemMan 1.0.0.1 Released!插图8
        }
;
MemMan 1.0.0.1 Released!插图8    }
;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2
public:
MemMan 1.0.0.1 Released!插图2    MemoryAllocator( UINT max_size )    
//    max allowed memory usage
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
    MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        allocated_size 
= 0;
MemMan 1.0.0.1 Released!插图2        available_size 
= max_size;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2        queue 
= NULL;
MemMan 1.0.0.1 Released!插图2        aligned_queue 
= NULL;
MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    
~MemoryAllocator()
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        dealloc_header( queue );
MemMan 1.0.0.1 Released!插图2        dealloc_aligned_header( aligned_queue );
MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    FORCEINLINE 
void    *alloc( UINT size, UINT priority, 
MemMan 1.0.0.1 Released!插图2                                
void *object, FreeContentFunc free_func )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        
if( size == 0 )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            
return NULL;
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图2        
else if( size > available_size )        //    searching has the complexity of O(N)
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
        MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            
void    *ptr = NULL;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
if( queue && queue->search_memory( size, 0, ptr, object, free_func ) )
MemMan 1.0.0.1 Released!插图2                
return ptr;
MemMan 1.0.0.1 Released!插图2            
else
MemMan 1.0.0.1 Released!插图2                
return NULL;    //    the system has run out of memoryMemMan 1.0.0.1 Released!插图5
MemMan 1.0.0.1 Released!插图8
        }

MemMan 1.0.0.1 Released!插图2        
else    //    the complexity is O(logN)
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
        MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            allocated_size 
+= ( sizeof(MemoryHeader) + size );
MemMan 1.0.0.1 Released!插图2            available_size 
-= ( sizeof(MemoryHeader) + size );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            MemoryHeader    
*elem;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
//    allocate a block
MemMan 1.0.0.1 Released!插图2
            elem = new (sys_alloc( sizeof(MemoryHeader) + size )) MemoryHeader( priority, object, free_func, 0 );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
if( queue )
MemMan 1.0.0.1 Released!插图2                queue
->create_child( elem );    //    insert the node
MemMan 1.0.0.1 Released!插图2
            else
MemMan 1.0.0.1 Released!插图2                queue 
= elem;    //    be the root
MemMan 1.0.0.1 Released!插图2

MemMan 1.0.0.1 Released!插图2            
return elem->get_memory();
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    FORCEINLINE 
void    *aligned_alloc( UINT size, UINT priority, 
MemMan 1.0.0.1 Released!插图2                                        
void *object, FreeContentFunc free_func, 
MemMan 1.0.0.1 Released!插图2                                        UINT align 
= DEFAULT_MEMORY_ALIGN )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        
if( size == 0 )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            
return NULL;
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图2        
else if( size > available_size )        //    searching has the complexity of O(N)
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
        MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            
void    *ptr = NULL;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
if( aligned_queue && aligned_queue->search_memory( size, align, ptr, object, free_func ) )
MemMan 1.0.0.1 Released!插图2                
return ptr;
MemMan 1.0.0.1 Released!插图2            
else
MemMan 1.0.0.1 Released!插图2                
return NULL;    //    the system has run out of memoryMemMan 1.0.0.1 Released!插图5
MemMan 1.0.0.1 Released!插图8
        }

MemMan 1.0.0.1 Released!插图2        
else    //    the complexity is O(logN)
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
        MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            allocated_size 
+= ( sizeof(MemoryHeader) + size );
MemMan 1.0.0.1 Released!插图2            available_size 
-= ( sizeof(MemoryHeader) + size );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            MemoryHeader    
*elem;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
//    allocate an aligned block
MemMan 1.0.0.1 Released!插图2
            elem = new (sys_aligned_alloc( sizeof(MemoryHeader) + size, align )) MemoryHeader( priority, object, free_func, align );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
if( aligned_queue )
MemMan 1.0.0.1 Released!插图2                aligned_queue
->create_child( elem );    //    insert the node
MemMan 1.0.0.1 Released!插图2
            else
MemMan 1.0.0.1 Released!插图2                aligned_queue 
= elem;    //    be the root
MemMan 1.0.0.1 Released!插图2

MemMan 1.0.0.1 Released!插图2            
return elem->get_memory();
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    
//    a lock must be used before the object being deallocated, the complexity is O(1)
MemMan 1.0.0.1 Released!插图2
    
MemMan 1.0.0.1 Released!插图2    FORCEINLINE 
void    lockvoid *ptr )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        
if( ptr )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            MemoryHeader    
*header = get_memory_header( ptr );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            header
->lock();
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    FORCEINLINE 
void    unlock( void *ptr )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        
if( ptr )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            MemoryHeader    
*header = get_memory_header( ptr );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            header
->unlock();
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    
//    deallocating has the complexity of O(logN)
MemMan 1.0.0.1 Released!插图2

MemMan 1.0.0.1 Released!插图2    FORCEINLINE 
void    dealloc( void *ptr, UINT size )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        
if( ptr )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            MemoryHeader    
*header, *node, *parent;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            header 
= get_memory_header( ptr );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            header
->dec_ref_count();
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
if( header->get_ref_count() != 0 )    //    still have objects reference this
MemMan 1.0.0.1 Released!插图2
                return;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            parent 
= header->parent;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
if( header->lchild && header->rchild )    //    has left child and right child
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
            MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                node 
= find_rightmost_child( header->lchild );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                
//    rebuild the links
MemMan 1.0.0.1 Released!插图2
                if( node != header->lchild )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7                
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    node
->parent->rchild = node->lchild;
MemMan 1.0.0.1 Released!插图2                    
if( node->lchild )
MemMan 1.0.0.1 Released!插图2                        node
->lchild->parent = node->parent;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                    node
->lchild = header->lchild;
MemMan 1.0.0.1 Released!插图2                    node
->lchild->parent = node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                node
->rchild = header->rchild;
MemMan 1.0.0.1 Released!插图2                node
->rchild->parent = node;
MemMan 1.0.0.1 Released!插图2                node
->parent = parent;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                
if( parent )    //    has parent
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    
if( parent->lchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->lchild = node;
MemMan 1.0.0.1 Released!插图2                    
else if( parent->rchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->rchild = node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图2                
else    //    it's the root
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    queue 
= node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图8            }

MemMan 1.0.0.1 Released!插图2            
else if( header->lchild )    //    has only left child
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
            MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                
//    rebuild the links
MemMan 1.0.0.1 Released!插图2
                node = header->lchild;
MemMan 1.0.0.1 Released!插图2                node
->parent = parent;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                
if( parent )    //    has parent
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    
if( parent->lchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->lchild = node;
MemMan 1.0.0.1 Released!插图2                    
else if( parent->rchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->rchild = node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图2                
else    //    it's the root
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    queue 
= node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图8            }

MemMan 1.0.0.1 Released!插图2            
else if( header->rchild )    //    has only right child
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
            MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                
//    rebuild the links
MemMan 1.0.0.1 Released!插图2
                node = header->rchild;
MemMan 1.0.0.1 Released!插图2                node
->parent = parent;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                
if( parent )    //    has parent
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    
if( parent->lchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->lchild = node;
MemMan 1.0.0.1 Released!插图2                    
else if( parent->rchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->rchild = node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图2                
else    //    it's the root
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    queue 
= node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图8            }

MemMan 1.0.0.1 Released!插图2            
else    //    has no child
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
            MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                
if( parent )    //    has parent
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    
if( parent->lchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->lchild = NULL;
MemMan 1.0.0.1 Released!插图2                    
else if( parent->rchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->rchild = NULL;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图2                
else    //    it's the root, clear it
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    queue 
= NULL;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图8            }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            allocated_size 
-= ( sizeof(MemoryHeader) + size );
MemMan 1.0.0.1 Released!插图2            available_size 
+= ( sizeof(MemoryHeader) + size );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            sys_dealloc( header );    
//    deallocate the block
MemMan 1.0.0.1 Released!插图8
        }

MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    FORCEINLINE 
void    aligned_dealloc( void *ptr, UINT size )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        
if( ptr )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            MemoryHeader    
*header, *node, *parent;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            header 
= get_memory_header( ptr );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            header
->dec_ref_count();
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
if( header->get_ref_count() != 0 )    //    still have objects reference this
MemMan 1.0.0.1 Released!插图2
                return;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            parent 
= header->parent;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
if( header->lchild && header->rchild )    //    has left child and right child
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
            MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                node 
= find_rightmost_child( header->lchild );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                
//    rebuild the links
MemMan 1.0.0.1 Released!插图2
                if( node != header->lchild )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7                
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    node
->parent->rchild = node->lchild;
MemMan 1.0.0.1 Released!插图2                    
if( node->lchild )
MemMan 1.0.0.1 Released!插图2                        node
->lchild->parent = node->parent;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                    node
->lchild = header->lchild;
MemMan 1.0.0.1 Released!插图2                    node
->lchild->parent = node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                node
->rchild = header->rchild;
MemMan 1.0.0.1 Released!插图2                node
->rchild->parent = node;
MemMan 1.0.0.1 Released!插图2                node
->parent = parent;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                
if( parent )    //    has parent
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    
if( parent->lchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->lchild = node;
MemMan 1.0.0.1 Released!插图2                    
else if( parent->rchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->rchild = node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图2                
else    //    it's the root
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    aligned_queue 
= node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图8            }

MemMan 1.0.0.1 Released!插图2            
else if( header->lchild )    //    has only left child
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
            MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                
//    rebuild the links
MemMan 1.0.0.1 Released!插图2
                node = header->lchild;
MemMan 1.0.0.1 Released!插图2                node
->parent = parent;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                
if( parent )    //    has parent
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    
if( parent->lchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->lchild = node;
MemMan 1.0.0.1 Released!插图2                    
else if( parent->rchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->rchild = node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图2                
else    //    it's the root
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    aligned_queue 
= node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图8            }

MemMan 1.0.0.1 Released!插图2            
else if( header->rchild )    //    has only right child
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
            MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                
//    rebuild the links
MemMan 1.0.0.1 Released!插图2
                node = header->rchild;
MemMan 1.0.0.1 Released!插图2                node
->parent = parent;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2                
if( parent )    //    has parent
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    
if( parent->lchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->lchild = node;
MemMan 1.0.0.1 Released!插图2                    
else if( parent->rchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->rchild = node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图2                
else    //    it's the root
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    aligned_queue 
= node;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图8            }

MemMan 1.0.0.1 Released!插图2            
else    //    has no child
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
            MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                
if( parent )    //    has parent
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    
if( parent->lchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->lchild = NULL;
MemMan 1.0.0.1 Released!插图2                    
else if( parent->rchild == header )
MemMan 1.0.0.1 Released!插图2                        parent
->rchild = NULL;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图2                
else    //    it's the root, clear it
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7
                MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2                    aligned_queue 
= NULL;
MemMan 1.0.0.1 Released!插图8                }

MemMan 1.0.0.1 Released!插图8            }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            allocated_size 
-= ( sizeof(MemoryHeader) + size );
MemMan 1.0.0.1 Released!插图2            available_size 
+= ( sizeof(MemoryHeader) + size );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            sys_aligned_dealloc( header );    
//    deallocate the block
MemMan 1.0.0.1 Released!插图8
        }

MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2
private:
MemMan 1.0.0.1 Released!插图2    
//    help functions
MemMan 1.0.0.1 Released!插图2

MemMan 1.0.0.1 Released!插图2    FORCEINLINE 
void    dealloc_header( MemoryHeader *node )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        
if( node )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            
if( node->lchild )
MemMan 1.0.0.1 Released!插图2                dealloc_header( node
->lchild );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
if( node->rchild )
MemMan 1.0.0.1 Released!插图2                dealloc_header( node
->rchild );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            sys_dealloc( node );
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    FORCEINLINE 
void    dealloc_aligned_header( MemoryHeader *node )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        
if( node )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            
if( node->lchild )
MemMan 1.0.0.1 Released!插图2                dealloc_aligned_header( node
->lchild );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            
if( node->rchild )
MemMan 1.0.0.1 Released!插图2                dealloc_aligned_header( node
->rchild );
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2            sys_aligned_dealloc( node );
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    FORCEINLINE MemoryHeader    
*find_rightmost_child( MemoryHeader *node )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        
while( node && node->rchild )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7        
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2            node 
= node->rchild;
MemMan 1.0.0.1 Released!插图8        }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2        
return node;
MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    FORCEINLINE MemoryHeader    
*get_memory_header( void *ptr )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        
//    get the biased value first
MemMan 1.0.0.1 Released!插图2
        MemoryHeaderBias    *pb = (MemoryHeaderBias *)((char *) ptr - sizeof(MemoryHeaderBias));
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2        
//    then get the header using the biased value
MemMan 1.0.0.1 Released!插图2
        MemoryHeader    *header = (MemoryHeader *)((char *) ptr - (*pb));
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2        
return header;
MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2
private:
MemMan 1.0.0.1 Released!插图2    
//    encapsulate system operations
MemMan 1.0.0.1 Released!插图2

MemMan 1.0.0.1 Released!插图2    FORCEINLINE 
void    *sys_alloc( UINT size )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        
return malloc( size );
MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    FORCEINLINE 
void    *sys_aligned_alloc( UINT size, UINT align )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        
return _mm_malloc( size, align );
MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    FORCEINLINE 
void    sys_dealloc( void *ptr )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        free( ptr );
MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    FORCEINLINE 
void    sys_aligned_dealloc( void *ptr )
MemMan 1.0.0.1 Released!插图6MemMan 1.0.0.1 Released!插图7    
MemMan 1.0.0.1 Released!插图5{
MemMan 1.0.0.1 Released!插图2        _mm_free( ptr );
MemMan 1.0.0.1 Released!插图8    }

MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2
private:
MemMan 1.0.0.1 Released!插图2    
//    memory statistics
MemMan 1.0.0.1 Released!插图2
    UINT                        allocated_size, 
MemMan 1.0.0.1 Released!插图2                                available_size;
MemMan 1.0.0.1 Released!插图2
MemMan 1.0.0.1 Released!插图2    
//    implement priority queues to record all the allocations
MemMan 1.0.0.1 Released!插图2
    MemoryHeader                *queue;
MemMan 1.0.0.1 Released!插图2    MemoryHeader                
*aligned_queue;
MemMan 1.0.0.1 Released!插图3}

;
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4#pragma pack(pop)
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4

#endif
    
//
    __MEM_MAN__

MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4
MemMan 1.0.0.1 Released!插图4
posted on
2007-10-24 17:09
Len3d 阅读(
...) 评论(
...)
编辑
收藏

转载于:https://www.cnblogs.com/len3d/archive/2007/10/24/936403.html

原文链接:https://blog.csdn.net/weixin_30342827/article/details/96450963

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《MemMan 1.0.0.1 Released!
   

还没有人抢沙发呢~