| 1177 | return false; |
| 1178 | } |
| 1179 | void* GetBasePointer(void* ptr) |
| 1180 | { |
| 1181 | if(!sortedPages.size() || ptr < sortedPages[0] || ptr > (char*)sortedPages.back() + sizeof(MyLargeBlock)) |
| 1182 | return NULL; |
| 1183 | // Binary search |
| 1184 | unsigned int lowerBound = 0; |
| 1185 | unsigned int upperBound = sortedPages.size() - 1; |
| 1186 | unsigned int pointer = 0; |
| 1187 | while(upperBound - lowerBound > 1) |
| 1188 | { |
| 1189 | pointer = (lowerBound + upperBound) >> 1; |
| 1190 | if(ptr < sortedPages[pointer]) |
| 1191 | upperBound = pointer; |
| 1192 | if(ptr > sortedPages[pointer]) |
| 1193 | lowerBound = pointer; |
| 1194 | } |
| 1195 | if(ptr < sortedPages[pointer]) |
| 1196 | pointer--; |
| 1197 | if(ptr > (char*)sortedPages[pointer] + sizeof(MyLargeBlock)) |
| 1198 | pointer++; |
| 1199 | MyLargeBlock *best = sortedPages[pointer]; |
| 1200 | |
| 1201 | if(ptr < best || ptr > (char*)best + sizeof(MyLargeBlock)) |
| 1202 | return NULL; |
| 1203 | unsigned int fromBase = (unsigned int)(intptr_t)((char*)ptr - (char*)best->page); |
| 1204 | return (char*)best->page + (fromBase & ~(elemSize - 1)) + 4; |
| 1205 | } |
| 1206 | void Mark(unsigned int number) |
| 1207 | { |
| 1208 | __assert(number < 128); |