void Heap::Check() { Mutex::Lock __(mutex); Init(); if(!work[0]->next) Init(); for(int i = 0; i < NKLASS; i++) { DblCheck(work[i]); DblCheck(full[i]); Page *p = work[i]->next; while(p != work[i]) { Assert(p->heap == this); Assert(CheckPageFree(p->freelist, p->klass) == p->Count() - p->active); p = p->next; } p = full[i]->next; while(p != full[i]) { Assert(p->heap == this); Assert(p->klass == i); Assert(p->active == p->Count()); p = p->next; } p = empty[i]; if(p) { for(;;) { Assert(p->heap == this); Assert(p->active == 0); Assert(p->klass == i); Assert(CheckPageFree(p->freelist, i) == p->Count()); if(this != &aux) break; p = p->next; if(!p) break; } } FreeLink *l = cache[i]; while(l) { DbgFreeCheckK(l, i); l = l->next; } } DLink *l = large->next; while(l != large) { Header *bh = (Header *)((byte *)l + LARGEHDRSZ); while(bh->size) { Assert((byte *)bh >= (byte *)l + LARGEHDRSZ && (byte *)bh < (byte *)l + 65536); if(bh->free) DbgFreeCheck(bh->GetBlock() + 1, bh->size - sizeof(DLink)); bh = bh->Next(); } l = l->next; } if(this != &aux) aux.Check(); }
void Heap::AuxFinalCheck() { Mutex::Lock __(mutex); aux.Init(); aux.FreeRemoteRaw(); aux.Check(); if(!aux.work[0]->next) aux.Init(); for(int i = 0; i < NKLASS; i++) { Assert(!aux.cache[i]); DblCheck(aux.work[i]); DblCheck(aux.full[i]); AssertLeaks(aux.work[i] == aux.work[i]->next); AssertLeaks(aux.full[i] == aux.full[i]->next); Page *p = aux.empty[i]; if(p) { for(;;) { Assert(p->heap == &aux); Assert(p->active == 0); Assert(CheckPageFree(p->freelist, p->klass) == p->Count()); p = p->next; if(!p) break; } } } AssertLeaks(aux.large == aux.large->next); AssertLeaks(big == big->next); }