| 206 | } |
| 207 | |
| 208 | FreeHeader* |
| 209 | FreeIndex::find(size_t search_size, unsigned char* pool_base) |
| 210 | { |
| 211 | unsigned int index = node_index(search_size); |
| 212 | FreeIndexNode* index_node = nodes_ + index; |
| 213 | |
| 214 | // Larger or equal to search_size |
| 215 | FreeHeader* result = NULL; |
| 216 | if (largest_free_ && (largest_free_->size() >= search_size)) { |
| 217 | result = largest_free_; |
| 218 | |
| 219 | // Look from here and larger |
| 220 | while (index_node < nodes_ + size_) { |
| 221 | if (index_node->ptr() && index_node->ptr()->size() >= search_size) { |
| 222 | result = index_node->ptr(); |
| 223 | break; |
| 224 | } |
| 225 | ++index_node; |
| 226 | } |
| 227 | } |
| 228 | |
| 229 | // Now traverse, searching for smaller than result |
| 230 | while (result) { |
| 231 | FreeHeader* smaller = result->smaller_free(pool_base); |
| 232 | if (smaller && smaller->size() >= search_size) { |
| 233 | result = smaller; |
| 234 | } else { |
| 235 | break; |
| 236 | } |
| 237 | } |
| 238 | |
| 239 | return result; |
| 240 | } |
| 241 | |
| 242 | unsigned int |
| 243 | FreeIndex::node_index(size_t size) |