void Cache :: line_rm_recursive(Addr addr) { Line *line = addr2line_internal(addr); if (line==NULL) return; NVLOG1("%s\tline_rm_recursive addr 0x%lx\n", this->_name.c_str(), addr); for (size_t child_i = 0; child_i<_children.size() && line->sharers>0; child_i++) { if (!bit(line->sharers, child_i)) continue; // a child is not a sharer, so continue Cache *child = dynamic_cast<Cache *>(_children[child_i]); assert(child!=NULL); for (Addr line_addr_iter=line->addr; line_addr_iter<line->addr+get_line_size(); line_addr_iter += child->get_line_size()) { child->line_rm_recursive(line_addr_iter); } } #ifdef HAS_HTM if (pprocessor) { pprocessor->cb_line_evicted(line); } #endif free(line->pdata); line->pdata = NULL; // remove in this cache as well this->line_rm(line); }