/** * Scans the list of InflatedHeader objects checking to see which are in use. * Those that do not have the appropriate mark value set are cleared and * added back to the free list. Chunks that are completely unused are removed * from the linked list. * * /param mark The current value of the mark; only InflatedHeaders that bear * this mark will be retained. */ void InflatedHeaders::deallocate_headers(int mark) { // Detect and free any full chunks first! for(Chunks::iterator i = chunks_.begin(); i != chunks_.end();) { InflatedHeader* chunk = *i; bool used = false; for(size_t j = 0; j < cChunkSize; j++) { InflatedHeader* header = &chunk[j]; if(header->marked_p(mark)) { used = true; break; } } // No header was marked, so it's completely empty. Free it. if(!used) { delete[] chunk; i = chunks_.erase(i); } else { ++i; } } // Ok, now, rebuild the free_list free_list_ = 0; in_use_ = 0; for(Chunks::iterator i = chunks_.begin(); i != chunks_.end(); ++i) { InflatedHeader* chunk = *i; for(size_t j = 0; j < cChunkSize; j++) { InflatedHeader* header = &chunk[j]; if(!header->marked_p(mark)) { header->clear(); header->set_next(free_list_); free_list_ = header; } else { in_use_++; } } } }