/** * 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_++; } } } }
void InflatedHeaders::deallocate_headers(unsigned int mark) { std::vector<bool> chunk_marks(allocator_->chunks_.size(), false); diagnostics_.objects_ = 0; for(std::vector<int>::size_type i = 0; i < allocator_->chunks_.size(); ++i) { InflatedHeader* chunk = allocator_->chunks_[i]; for(size_t j = 0; j < allocator_->cChunkSize; j++) { InflatedHeader* header = &chunk[j]; if(header->marked_p(mark)) { chunk_marks[i] = true; diagnostics_.objects_++; } else { header->clear(); } } } allocator_->rebuild_freelist(&chunk_marks); diagnostics_.bytes_ = allocator_->in_use_ * sizeof(InflatedHeader); diagnostics_.modify(); }
void InflatedHeaders::deallocate_headers(unsigned int mark) { std::vector<bool> chunk_marks(allocator_->chunks_.size(), false); for(std::vector<int>::size_type i = 0; i < allocator_->chunks_.size(); ++i) { InflatedHeader* chunk = allocator_->chunks_[i]; for(size_t j = 0; j < allocator_->cChunkSize; j++) { InflatedHeader* header = &chunk[j]; if(header->marked_p(mark)) { chunk_marks[i] = true; } else { header->clear(); } } } allocator_->rebuild_freelist(&chunk_marks); }