void free_mapping(struct mapping *m) { short i; if (!m->ref || --m->ref > 0) return; for (i = 0; i < m->size; i++) m->card -= free_apairs(m->pairs[i]); num_mappings--; total_mapping_size -= (sizeof(struct apair *) * m->size + sizeof(struct mapping)); free((char *)m->pairs); free((char *)m); }
void mem_mapping(struct mapping *m) { struct apair **p; int i; int size; if (m->size < 0) return; size = m->size; m->size = -1; for (i = 0 ; i < size ; i++) { for(p = &m->pairs[i]; *p; ) { /* Check for destructed objects while we'r at it :) */ if ((*p)->arg.type == T_OBJECT && ((*p)->arg.u.ob->flags & O_DESTRUCTED)) { struct apair *f; f = *p; *p = f->next; f->next = 0; m->card -= free_apairs(f); mapping_elem--; } else { mem_incr(&(*p)->arg); mem_incr(&(*p)->val); p = &(*p)->next; } } } m->size = size; }