00001
00002
00003
00004 #include "internal.h"
00005
00006
00007
00008
00009
00010
00011 static
00012 int _tm_root_add_1(tm_root *a)
00013 {
00014 int i;
00015 #define MAX_ROOTS (sizeof(tm.roots)/sizeof(tm.roots[0]))
00016
00017 if ( a->l >= a->h )
00018 return -1;
00019
00020
00021 for ( i = 0; i < MAX_ROOTS; ++ i ) {
00022 if ( tm.roots[i].name == 0 || tm.roots[i].l == tm.roots[i].h ) {
00023 break;
00024 }
00025 }
00026
00027 if ( tm.nroots <= i ) {
00028 tm.nroots = i + 1;
00029 }
00030
00031 tm_assert_test(i < MAX_ROOTS);
00032 tm_assert_test(i >= tm.root_datai);
00033
00034 if ( tm.root_newi == -1 ) {
00035 tm.root_newi = i;
00036 }
00037
00038 tm.roots[i] = *a;
00039
00040 tm_msg("R a [%p,%p] %s %d\n",
00041 tm.roots[i].l,
00042 tm.roots[i].h,
00043 tm.roots[i].name,
00044 i);
00045
00046 return i;
00047 }
00048 #undef MAX_ROOTS
00049
00050
00051
00052
00053
00054
00055 static
00056 int tm_root_subtract(tm_root *a, tm_root *b, tm_root *c)
00057 {
00058 const void *tmp;
00059
00060 if ( a->l > a->h ) {
00061 tmp = a->l; a->l = a->h; a->h = tmp;
00062 }
00063 if ( b->l > b->h ) {
00064 tmp = b->l; b->l = b->h; b->h = tmp;
00065 }
00066
00067 if ( b->l == b->h ) {
00068 return 0;
00069 }
00070
00071 if ( (a->l == b->l) || (b->l <= a->l && a->h <= b->h) ) {
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 return -1;
00086 }
00087 if ( b->h <= a->l || b->l >= a->h ) {
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 return 0;
00103 }
00104 if ( a->l < b->l && b->h < a->h ) {
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 c[0] = *a;
00121 c[0].l = b->h;
00122 c[1] = *a;
00123 c[1].h = b->l;
00124 return 2;
00125 }
00126 if ( a->l < b->h && b->h <= a->h ) {
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140 *c = *a;
00141 c->l = b->h;
00142 return 1;
00143 }
00144 if ( a->l < b->l && b->l <= a->h ) {
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158 *c = *a;
00159 c->h = b->l;
00160 return 1;
00161 }
00162
00163 tm_abort();
00164 return -1;
00165 }
00166
00167
00168
00169
00170
00171 static
00172 void _tm_root_add(tm_root *a)
00173 {
00174 int i;
00175 tm_root c[2];
00176
00177
00178 for ( i = 0; i < tm.naroots; ++ i ) {
00179 switch ( tm_root_subtract(a, &tm.aroots[i], c) ) {
00180 case -1:
00181 return;
00182 break;
00183
00184 case 0:
00185 break;
00186
00187 case 1:
00188 *a = c[0];
00189 break;
00190
00191 case 2:
00192 _tm_root_add(&c[0]);
00193 *a = c[1];
00194 break;
00195 }
00196 }
00197
00198 _tm_root_add_1(a);
00199 }
00200
00201
00202
00203
00204
00205 int tm_root_add(const char *name, const void *l, const void *h)
00206 {
00207 tm_root a;
00208
00209 a.name = name;
00210 a.l = l;
00211 a.h = h;
00212
00213 tm.root_newi = -1;
00214
00215 tm_msg("R A [%p,%p] %s PRE\n",
00216 a.l,
00217 a.h,
00218 a.name);
00219
00220 _tm_root_add(&a);
00221
00222 return tm.root_newi;
00223 }
00224
00225
00226 void tm_root_remove(const char * name, const void *l, const void *h)
00227 {
00228 int i;
00229 tm_root *a, *b, c[2];
00230
00231
00232 b = &tm.aroots[i = tm.naroots ++];
00233 b->name = name;
00234 b->l = l;
00235 b->h = h;
00236
00237 tm_msg("R A [%p,%p] %s ANTI-ROOT %d\n",
00238 tm.aroots[i].l,
00239 tm.aroots[i].h,
00240 tm.aroots[i].name,
00241 i);
00242
00243
00244
00245
00246 for ( i = tm.root_datai; i < tm.nroots; ++ i ) {
00247 int j;
00248
00249 for ( j = 0; j < tm.naroots; ++ j ) {
00250 a = &tm.roots[i];
00251 b = &tm.aroots[j];
00252
00253 switch ( tm_root_subtract(a, b, c) ) {
00254 case -1:
00255 a->l = a->h = 0;
00256 j = tm.naroots;
00257 break;
00258
00259 case 1:
00260 *a = *c;
00261 break;
00262
00263 case 2:
00264 *a = *c;
00265 _tm_root_add(&c[1]);
00266 i = 1; j = -1;
00267 break;
00268 }
00269 }
00270 }
00271 }
00272
00273
00274 int tm_ptr_is_in_root_set(const void *ptr)
00275 {
00276 int i;
00277
00278 for ( i = 0; i < tm.nroots; ++ i ) {
00279 if ( tm.roots[i].l <= ptr && ptr < tm.roots[i].h ) {
00280 return i + 1;
00281 }
00282 }
00283
00284 return 0;
00285 }
00286
00287