00001 #ifndef __EH_MEM_H__
00002 #define __EH_MEM_H__
00003
00004 #include <glib.h>
00005 #include <utils/eh_types.h>
00006
00007 #define EH_MEM_LEAK_START { glong __s = eh_mem_in_use(), __e;
00008 #define EH_MEM_LEAK_END_WARN __e = eh_mem_in_use(); if ( __e!=__s ) { eh_watch_lng( __s ); eh_watch_lng(__e); } }
00009 #define EH_MEM_LEAK_END_FATAL __e = eh_mem_in_use(); if ( __e!=__s ) { eh_watch_lng( __s ); eh_watch_lng(__e); eh_exit(0); } }
00010
00011 #define eh_compiler_require(exp) extern char _compiler_require[(exp)?1:-1]
00012
00013 #define API_ENTRY
00014 #define LOCAL static
00015
00016 #define IS_POWER_2(x) ( !((x)&((x)-1)) )
00017
00018 #define USE_WIN_ASSERT static char source_file[] = __FILE__; \
00019 int static _do_win_assert( int line_no ) { \
00020 report_win_assert( source_file , line_no ); \
00021 win_assert( line_no ); \
00022 return( 0 ); \
00023 }
00024 #define assert_error _do_win_assert( __LINE__ )
00025 #define win_assert( exp ) if ( !(exp) ) { assert_error; } else
00026 void API_ENTRY report_win_assert( char *file_name , int line_no );
00027
00028 #define USE_MY_VTABLE
00029
00030 gpointer API_ENTRY eh_malloc ( gsize w_size , Class_Desc desc , const char* file , int line_no );
00031 gpointer API_ENTRY eh_realloc ( gpointer old , gsize w_size , const char *file , int line_no );
00032 void API_ENTRY eh_walk_heap ( void );
00033 gboolean API_ENTRY eh_is_ptr_ok ( gpointer mem );
00034 gpointer API_ENTRY eh_malloc_c_style ( gsize w_size );
00035 gpointer API_ENTRY eh_calloc_c_style ( gsize n_blocks , gsize n_block_bytes );
00036 gpointer API_ENTRY eh_realloc_c_style( gpointer mem , gsize w_size );
00037
00038 #if defined( USE_MY_VTABLE )
00039 glong API_ENTRY eh_mem_in_use( void );
00040 void* API_ENTRY eh_free_mem ( gpointer mem );
00041 void API_ENTRY eh_heap_dump ( const char* file );
00042 void API_ENTRY eh_free_c_style ( gpointer mem );
00043
00044 #define eh_new( type , n ) ( (type*)eh_malloc( ((gsize)(sizeof(type)))*((gsize)(n)) , \
00045 G_STRINGIFY(type) , \
00046 __FILE__ , \
00047 __LINE__ ) )
00048 #define eh_new0( type , n ) ( (type*)eh_malloc( ((gsize)(sizeof(type)))*((gsize)(n)) , \
00049 G_STRINGIFY(type) , \
00050 __FILE__ , \
00051 __LINE__ ) )
00052 #define eh_renew( type , old , n ) ( (type*)eh_realloc( (old) , \
00053 ((gsize)sizeof(type))*((gsize)(n)) , \
00054 __FILE__ , \
00055 __LINE__ ) )
00056 #define eh_free( mem ) ( (mem) = eh_free_mem( mem ) )
00057
00058 #else
00059
00060 #define eh_new( type , n ) ( g_new0( type , n ) )
00061 #define eh_new0( type , n ) ( g_new0( type , n ) )
00062 #define eh_renew( type , old , n ) ( g_renew( type , old , n ) )
00063 #define eh_free( mem ) ( g_free( mem ) )
00064 #define eh_free_mem ( g_free )
00065 #define eh_free_c_style ( g_free )
00066 #define eh_heap_dump( file ) ( g_mem_profile() )
00067
00068 #endif
00069
00070 void** eh_alloc_2 ( gssize m , gssize n , gssize size );
00071 void eh_free_void_2( void **p );
00072
00073 #endif
00074