| 963 | } |
| 964 | |
| 965 | void validate_pool(MemoryPool& pool, size_t expected_allocated_bytes, |
| 966 | bool log = false) { |
| 967 | AllocHeader* prev = 0; |
| 968 | size_t allocated_bytes = 0; |
| 969 | size_t free_bytes = 0; |
| 970 | size_t oh_bytes = 0; |
| 971 | size_t free_count = 0; |
| 972 | unsigned char* pool_end = pool.pool_ptr_ + pool.pool_size_; |
| 973 | bool prev_was_free = false; |
| 974 | size_t index = 0; |
| 975 | |
| 976 | typedef std::map<FreeHeader*, int> FreeMap; |
| 977 | FreeMap free_map; |
| 978 | // Gather all free indices |
| 979 | AllocHeader* alloc = reinterpret_cast<AllocHeader*>(pool.pool_ptr_); |
| 980 | while (pool.includes(alloc)) { |
| 981 | FreeHeader* free_header = alloc->is_free() ? |
| 982 | reinterpret_cast<FreeHeader*>(alloc) : NULL; |
| 983 | if (free_header) { |
| 984 | free_map[free_header] = static_cast<int>(index); |
| 985 | } |
| 986 | alloc = alloc->next_adjacent(); |
| 987 | ++index; |
| 988 | } |
| 989 | |
| 990 | index = 0; |
| 991 | if (log) { |
| 992 | printf("Pool ptr %zx end %zx\n", (size_t)pool.pool_ptr_, |
| 993 | (size_t)pool_end); |
| 994 | } |
| 995 | |
| 996 | // Check all allocs in positional order and not overlapping |
| 997 | alloc = reinterpret_cast<AllocHeader*>(pool.pool_ptr_); |
| 998 | while (pool.includes(alloc)) { |
| 999 | if (log) { |
| 1000 | |
| 1001 | String smaller = "[ ]"; |
| 1002 | String larger = "[ ]"; |
| 1003 | |
| 1004 | FreeHeader* free_header = alloc->is_free() ? |
| 1005 | reinterpret_cast<FreeHeader*>(alloc) : NULL; |
| 1006 | if (free_header) { |
| 1007 | FreeMap::const_iterator found; |
| 1008 | found = free_map.find(free_header->smaller_free(pool.pool_ptr_)); |
| 1009 | if (found != free_map.end()) { |
| 1010 | smaller = "[" + to_dds_string(found->second) + "]"; |
| 1011 | } |
| 1012 | found = free_map.find(free_header->larger_free(pool.pool_ptr_)); |
| 1013 | if (found != free_map.end()) { |
| 1014 | larger = "[" + to_dds_string(found->second) + "]"; |
| 1015 | } |
| 1016 | } |
| 1017 | printf( |
| 1018 | "Alloc[%zu] %s at %zx ptr %zx lg %s sm %s size %d psize %d\n", |
| 1019 | index++, |
| 1020 | alloc->is_free() ? |
| 1021 | (alloc == pool.largest_free_ ? "FREE!" : "free ") : " ", |
| 1022 | (size_t)alloc, |
nothing calls this directly
no test coverage detected