示例#1
0
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);
}