00001
00002
00003
00004 #ifndef tm_PTR_H
00005 #define tm_PTR_H
00006
00007
00008 #ifdef tm_ptr_to_node_TEST
00009 #define tm_ptr_to_node_TEST 0
00010 #endif
00011
00012
00013
00014
00015
00016
00017
00018 static __inline
00019 tm_type *tm_block_to_type(tm_block *b)
00020 {
00021 return b->type;
00022 }
00023
00024
00025
00026
00027
00028
00029
00030 static __inline
00031 tm_block *tm_ptr_to_block(char *p)
00032 {
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 #if tm_ptr_AT_END_IS_VALID
00076 char *b;
00077 size_t offset;
00078
00079
00080 offset = (((unsigned long) p) % tm_block_SIZE);
00081 b = p - offset;
00082
00083 if ( offset == 0 && p ) {
00084
00085 b -= tm_block_SIZE;
00086 tm_msg("P bb p%p b%p\n", (void*) p, (void*) b);
00087
00088 }
00089
00090 return (void*) b;
00091 #else
00092
00093
00094
00095
00096 return (void*) ((unsigned long) p & tm_block_SIZE_MASK);
00097 #endif
00098 }
00099
00100
00101
00102
00103
00104
00105
00106 static __inline
00107 tm_node *tm_pure_ptr_to_node(void *_p)
00108 {
00109
00110 return ((tm_node*) _p) - 1;
00111 }
00112
00113
00114
00115
00116
00117
00118
00119 static __inline
00120 void *tm_node_to_ptr(tm_node *n)
00121 {
00122 return (void*) (n + 1);
00123 }
00124
00125
00126
00127
00128
00129 static __inline
00130 tm_block *tm_node_to_block(tm_node *n)
00131 {
00132 return tm_ptr_to_block(tm_node_to_ptr(n));
00133 }
00134
00135
00136
00137
00138
00139 static __inline
00140 tm_node *tm_ptr_to_node(void *p)
00141 {
00142 tm_block *b;
00143
00144 #if 0
00145
00146 if ( ! p )
00147 return 0;
00148 #endif
00149
00150
00151
00152
00153
00154
00155
00156 #if tm_ptr_AT_END_IS_VALID
00157 if ( tm_ptr_is_aligned_to_block(p) ) {
00158
00159 p = p - 1;
00160 }
00161 #endif
00162
00163 #if 1
00164
00165 if ( ! _tm_page_in_use(p) )
00166 return 0;
00167 #else
00168
00169 if ( ! (tm_ptr_l <= p && p <= tm_ptr_h) )
00170 return 0;
00171 #endif
00172
00173
00174 b = tm_ptr_to_block(p);
00175
00176 _tm_block_validate(b);
00177
00178
00179 if ( ! b->type )
00180 return 0;
00181
00182
00183 if ( p > tm_block_node_next_parcel(b) )
00184 return 0;
00185
00186 if ( p < tm_block_node_begin(b) )
00187 return 0;
00188
00189
00190 {
00191 unsigned long pp = (unsigned long) p;
00192 unsigned long node_size = tm_block_node_size(b);
00193 tm_node *n;
00194
00195
00196
00197
00198 pp -= (unsigned long) b + tm_block_HDR_SIZE;
00199
00200
00201 {
00202 unsigned long node_off = pp % node_size;
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 #if tm_ptr_AT_END_IS_VALID
00224 if ( node_off == 0 && pp ) {
00225 pp -= node_size;
00226 pp += (unsigned long) b + tm_block_HDR_SIZE;
00227
00228 #if 0
00229 tm_msg("P nb p%p p0%p\n", (void*) p, (void*) pp);
00230 #endif
00231 } else
00232 #endif
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249 if ( node_off < tm_node_HDR_SIZE ) {
00250 return 0;
00251 }
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269 else {
00270 pp -= node_off;
00271
00272
00273
00274
00275 pp += (unsigned long) b + tm_block_HDR_SIZE;
00276 }
00277 }
00278
00279
00280 n = (tm_node*) pp;
00281
00282
00283 if ( tm_node_color(n) == tm_WHITE )
00284 return 0;
00285
00286
00287 return n;
00288 }
00289 }
00290
00291
00292
00293
00294
00295 static __inline
00296 tm_type *tm_node_to_type(tm_node *n)
00297 {
00298 tm_block *b = tm_ptr_to_block((char*) n);
00299 _tm_block_validate(b);
00300 return b->type;
00301 }
00302
00303
00304
00305 #endif