Edit

kc3-lang/ftgl/test/mmgr.h

Branch :

  • Show log

    Commit

  • Author : ellers
    Date : 2003-01-30 12:24:08
    Hash : 3c0fb00d
    Message : updates for win32 build

  • test/mmgr.h
  • // ---------------------------------------------------------------------------------------------------------------------------------
    //                                     _     
    //                                    | |    
    //  _ __ ___  _ __ ___   __ _ _ __    | |__  
    // | '_ ` _ \| '_ ` _ \ / _` | '__|   | '_ \ 
    // | | | | | | | | | | | (_| | |    _ | | | |
    // |_| |_| |_|_| |_| |_|\__, |_|   (_)|_| |_|
    //                       __/ |               
    //                      |___/                
    //
    // Memory manager & tracking software
    //
    // Best viewed with 8-character tabs and (at least) 132 columns
    //
    // ---------------------------------------------------------------------------------------------------------------------------------
    //
    // Restrictions & freedoms pertaining to usage and redistribution of this software:
    //
    //  * This software is 100% free
    //  * If you use this software (in part or in whole) you must credit the author.
    //  * This software may not be re-distributed (in part or in whole) in a modified
    //    form without clear documentation on how to obtain a copy of the original work.
    //  * You may not use this software to directly or indirectly cause harm to others.
    //  * This software is provided as-is and without warrantee. Use at your own risk.
    //
    // For more information, visit HTTP://www.FluidStudios.com
    //
    // ---------------------------------------------------------------------------------------------------------------------------------
    // Originally created on 12/22/2000 by Paul Nettle
    //
    // Copyright 2000, Fluid Studios, Inc., all rights reserved.
    // ---------------------------------------------------------------------------------------------------------------------------------
    
    #ifndef	_H_MMGR
    #define	_H_MMGR
    
    
    #ifdef __APPLE_CC__
    //MAC hjm 7/11/2000
    typedef unsigned long size_t;
    #endif
    
    
    // ---------------------------------------------------------------------------------------------------------------------------------
    // For systems that don't have the __FUNCTION__ variable, we can just define it here
    // ---------------------------------------------------------------------------------------------------------------------------------
    
    #define	__FUNCTION__ "??"
    
    // ---------------------------------------------------------------------------------------------------------------------------------
    // Types
    // ---------------------------------------------------------------------------------------------------------------------------------
    
    typedef	struct tag_au
    {
    	size_t		actualSize;
    	size_t		reportedSize;
    	void		*actualAddress;
    	void		*reportedAddress;
    	char		sourceFile[40];
    	char		sourceFunc[40];
    	unsigned int	sourceLine;
    	unsigned int	allocationType;
    	bool		breakOnDealloc;
    	bool		breakOnRealloc;
    	unsigned int	allocationNumber;
    	struct tag_au	*next;
    	struct tag_au	*prev;
    } sAllocUnit;
    
    typedef	struct
    {
    	unsigned int	totalReportedMemory;
    	unsigned int	totalActualMemory;
    	unsigned int	peakReportedMemory;
    	unsigned int	peakActualMemory;
    	unsigned int	accumulatedReportedMemory;
    	unsigned int	accumulatedActualMemory;
    	unsigned int	accumulatedAllocUnitCount;
    	unsigned int	totalAllocUnitCount;
    	unsigned int	peakAllocUnitCount;
    } sMStats;
    
    // ---------------------------------------------------------------------------------------------------------------------------------
    // External constants
    // ---------------------------------------------------------------------------------------------------------------------------------
    
    extern	const	unsigned int	m_alloc_unknown;
    extern	const	unsigned int	m_alloc_new;
    extern	const	unsigned int	m_alloc_new_array;
    extern	const	unsigned int	m_alloc_malloc;
    extern	const	unsigned int	m_alloc_calloc;
    extern	const	unsigned int	m_alloc_realloc;
    extern	const	unsigned int	m_alloc_delete;
    extern	const	unsigned int	m_alloc_delete_array;
    extern	const	unsigned int	m_alloc_free;
    
    // ---------------------------------------------------------------------------------------------------------------------------------
    // Used by the macros
    // ---------------------------------------------------------------------------------------------------------------------------------
    
    void		m_setOwner(const char *file, const unsigned int line, const char *func);
    
    // ---------------------------------------------------------------------------------------------------------------------------------
    // Allocation breakpoints
    // ---------------------------------------------------------------------------------------------------------------------------------
    
    bool		&m_breakOnRealloc(void *reportedAddress);
    bool		&m_breakOnDealloc(void *reportedAddress);
    
    // ---------------------------------------------------------------------------------------------------------------------------------
    // The meat of the memory tracking software
    // ---------------------------------------------------------------------------------------------------------------------------------
    
    void		*m_allocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc,
    			     const unsigned int allocationType, const size_t reportedSize);
    void		*m_reallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc,
    			       const unsigned int reallocationType, const size_t reportedSize, void *reportedAddress);
    void		m_deallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc,
    			      const unsigned int deallocationType, const void *reportedAddress);
    
    // ---------------------------------------------------------------------------------------------------------------------------------
    // Utilitarian functions
    // ---------------------------------------------------------------------------------------------------------------------------------
    
    bool		m_validateAddress(const void *reportedAddress);
    bool		m_validateAllocUnit(const sAllocUnit *allocUnit);
    bool		m_validateAllAllocUnits();
    
    // ---------------------------------------------------------------------------------------------------------------------------------
    // Unused RAM calculations
    // ---------------------------------------------------------------------------------------------------------------------------------
    
    unsigned int	m_calcUnused(const sAllocUnit *allocUnit);
    unsigned int	m_calcAllUnused();
    
    // ---------------------------------------------------------------------------------------------------------------------------------
    // Logging and reporting
    // ---------------------------------------------------------------------------------------------------------------------------------
    
    void		m_dumpAllocUnit(const sAllocUnit *allocUnit, const char *prefix = "");
    void		m_dumpMemoryReport(const char *filename = "memreport.log", const bool overwrite = true);
    sMStats		m_getMemoryStatistics();
    
    // ---------------------------------------------------------------------------------------------------------------------------------
    // Variations of global operators new & delete
    // ---------------------------------------------------------------------------------------------------------------------------------
    
    void	*operator new(size_t reportedSize);
    void	*operator new[](size_t reportedSize);
    void	*operator new(size_t reportedSize, const char *sourceFile, int sourceLine);
    void	*operator new[](size_t reportedSize, const char *sourceFile, int sourceLine);
    void	operator delete(void *reportedAddress);
    void	operator delete[](void *reportedAddress);
    
    #endif // _H_MMGR
    
    // ---------------------------------------------------------------------------------------------------------------------------------
    // Macros -- "Kids, please don't try this at home. We're trained professionals here." :)
    // ---------------------------------------------------------------------------------------------------------------------------------
    
    #include "nommgr.h"
    #define	new		(m_setOwner  (__FILE__,__LINE__,__FUNCTION__),false) ? NULL : new
    #define	delete		(m_setOwner  (__FILE__,__LINE__,__FUNCTION__),false) ? m_setOwner("",0,"") : delete
    #define	malloc(sz)	m_allocator  (__FILE__,__LINE__,__FUNCTION__,m_alloc_malloc,sz)
    #define	calloc(sz)	m_allocator  (__FILE__,__LINE__,__FUNCTION__,m_alloc_calloc,sz)
    #define	realloc(ptr,sz)	m_reallocator(__FILE__,__LINE__,__FUNCTION__,m_alloc_realloc,sz,ptr)
    #define	free(ptr)	m_deallocator(__FILE__,__LINE__,__FUNCTION__,m_alloc_free,ptr)
    
    // ---------------------------------------------------------------------------------------------------------------------------------
    // mmgr.h - End of file
    // ---------------------------------------------------------------------------------------------------------------------------------