squid_off_t stmemFreeDataUpto(mem_hdr * mem, squid_off_t target_offset) { squid_off_t current_offset = mem->origin_offset; mem_node *p = mem->head; while (p && ((current_offset + p->len) <= target_offset)) { if (p == mem->tail) { /* keep the last one to avoid change to other part of code */ mem->head = mem->tail; mem->origin_offset = current_offset; return current_offset; } else { mem_node *lastp = p; p = p->next; current_offset += lastp->len; store_mem_size -= SM_PAGE_SIZE; stmemNodeFree(lastp); } } mem->head = p; mem->origin_offset = current_offset; if (current_offset < target_offset) { /* there are still some data left. */ return current_offset; } assert(current_offset == target_offset); return current_offset; }
void stmemNodeUnref(mem_node_ref * r) { if (!r->node) return; stmemNodeFree((void *) r->node); r->node = NULL; r->offset = -1; }
void stmemFree(mem_hdr * mem) { mem_node *p; while ((p = mem->head)) { mem->head = p->next; store_mem_size -= SM_PAGE_SIZE; stmemNodeFree(p); } mem->head = mem->tail = NULL; mem->origin_offset = 0; }