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