main() { struct node *start=NULL; start=create_list(start); display(start); MoveLarge(start); display(start); MoveSmall(start); display(start); }/*End of main()*/
void Heap::Shutdown() { LLOG("Shutdown"); Mutex::Lock __(mutex); Init(); FreeRemoteRaw(); for(int i = 0; i < NKLASS; i++) { LLOG("Free cache " << i); FreeLink *l = cache[i]; while(l) { FreeLink *h = l; l = l->next; FreeDirect(h); } while(full[i]->next != full[i]) { Page *p = full[i]->next; p->Unlink(); p->heap = &aux; p->Link(aux.full[i]); LLOG("Orphan full " << (void *)p); } while(work[i]->next != work[i]) { Page *p = work[i]->next; p->Unlink(); p->heap = &aux; p->Link(p->freelist ? aux.work[i] : aux.full[i]); LLOG("Orphan work " << (void *)p); } if(empty[i]) { ASSERT(empty[i]->freelist); ASSERT(empty[i]->active == 0); empty[i]->heap = &aux; empty[i]->next = aux.empty[i]; aux.empty[i] = empty[i]; LLOG("Orphan empty " << (void *)empty[i]); } } while(large != large->next) { Header *bh = (Header *)((byte *)large->next + LARGEHDRSZ); LLOG("Orphan large block " << (void *)large->next << " size: " << bh->size); if(bh->size == MAXBLOCK && bh->free) MoveToEmpty(large->next, bh); else MoveLarge(&aux, large->next); } memset(this, 0, sizeof(Heap)); }