| 145 | return false; |
| 146 | } |
| 147 | void* GetBasePointer(void* ptr) |
| 148 | { |
| 149 | if(!sortedPages.size() || ptr < sortedPages[0] || ptr > (char*)sortedPages.back() + sizeof(MyLargeBlock)) |
| 150 | return NULL; |
| 151 | // Binary search |
| 152 | unsigned int lowerBound = 0; |
| 153 | unsigned int upperBound = sortedPages.size() - 1; |
| 154 | unsigned int pointer = 0; |
| 155 | while(upperBound - lowerBound > 1) |
| 156 | { |
| 157 | pointer = (lowerBound + upperBound) >> 1; |
| 158 | if(ptr < sortedPages[pointer]) |
| 159 | upperBound = pointer; |
| 160 | if(ptr > sortedPages[pointer]) |
| 161 | lowerBound = pointer; |
| 162 | } |
| 163 | if(ptr < sortedPages[pointer]) |
| 164 | pointer--; |
| 165 | if(ptr > (char*)sortedPages[pointer] + sizeof(MyLargeBlock)) |
| 166 | pointer++; |
| 167 | MyLargeBlock *best = sortedPages[pointer]; |
| 168 | |
| 169 | if(ptr < best || ptr > (char*)best + sizeof(MyLargeBlock)) |
| 170 | return NULL; |
| 171 | unsigned int fromBase = (unsigned int)(intptr_t)((char*)ptr - (char*)best->page); |
| 172 | return (char*)best->page + (fromBase & ~(elemSize - 1)) + sizeof(markerType); |
| 173 | } |
| 174 | void Mark(unsigned int number) |
| 175 | { |
| 176 | assert(number <= 1); |