00001
00002
00003
00004
00005
00006
00007
00008 #include "internal.h"
00009
00010
00011 int _tm_user_bss[4];
00012
00013 int _tm_user_data[4] = { 0, 1, 2, 3 };
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 void *tm_alloc(size_t size)
00030 {
00031 void *ptr = 0;
00032
00033 if ( size == 0 )
00034 return 0;
00035
00036 if ( ! tm.inited ) {
00037 tm_init(0, (char***) ptr, 0);
00038 }
00039
00040 #if tm_TIME_STAT
00041 tm_time_stat_begin(&tm.ts_alloc);
00042 #endif
00043
00044 _tm_clear_some_stack_words();
00045 _tm_set_stack_ptr(&ptr);
00046
00047 if ( tm.trigger_full_gc ) {
00048 tm.trigger_full_gc = 0;
00049 _tm_gc_full_inner();
00050 }
00051
00052 ptr = _tm_alloc_inner(size);
00053
00054 #if tm_TIME_STAT
00055 tm_time_stat_end(&tm.ts_alloc);
00056 #endif
00057
00058 return ptr;
00059 }
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 void *tm_alloc_desc(tm_adesc *desc)
00073 {
00074 void *ptr = 0;
00075
00076 if ( desc == 0 || desc->size == 0 )
00077 return 0;
00078
00079 #if tm_TIME_STAT
00080 tm_time_stat_begin(&tm.ts_alloc);
00081 #endif
00082
00083 _tm_clear_some_stack_words();
00084 _tm_set_stack_ptr(&ptr);
00085 ptr = _tm_alloc_desc_inner(desc);
00086
00087 #if tm_TIME_STAT
00088 tm_time_stat_end(&tm.ts_alloc);
00089 #endif
00090
00091 return ptr;
00092 }
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 void *tm_realloc(void *oldptr, size_t size)
00111 {
00112 void *ptr = 0;
00113
00114 if ( oldptr == 0 )
00115 return tm_alloc(size);
00116
00117 if ( size == 0 ) {
00118 tm_free(oldptr);
00119 return 0;
00120 }
00121
00122 #if tm_TIME_STAT
00123 tm_time_stat_begin(&tm.ts_alloc);
00124 #endif
00125
00126 _tm_clear_some_stack_words();
00127 _tm_set_stack_ptr(&ptr);
00128 ptr = _tm_realloc_inner(oldptr, size);
00129
00130 #if tm_TIME_STAT
00131 tm_time_stat_end(&tm.ts_alloc);
00132 #endif
00133
00134 return ptr;
00135 }
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 void tm_free(void *ptr)
00152 {
00153 if ( ! tm.inited ) {
00154 tm_init(0, (char***) ptr, 0);
00155 }
00156
00157 #if tm_TIME_STAT
00158 tm_time_stat_begin(&tm.ts_free);
00159 #endif
00160
00161 _tm_clear_some_stack_words();
00162 _tm_set_stack_ptr(&ptr);
00163 _tm_free_inner(ptr);
00164
00165 #if tm_TIME_STAT
00166 tm_time_stat_end(&tm.ts_free);
00167 #endif
00168 }
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184 void tm_gc_full()
00185 {
00186 void *ptr = 0;
00187
00188 if ( ! tm.inited ) {
00189 tm_init(0, (char***) ptr, 0);
00190 }
00191
00192 #if tm_TIME_STAT
00193 tm_time_stat_begin(&tm.ts_gc);
00194 #endif
00195
00196 _tm_clear_some_stack_words();
00197 _tm_set_stack_ptr(&ptr);
00198
00199 _tm_gc_full_inner();
00200
00201 #if tm_TIME_STAT
00202 tm_time_stat_end(&tm.ts_gc);
00203 #endif
00204 }
00205
00206
00207