1
0
mirror of https://github.com/golang/go synced 2024-11-13 18:40:22 -07:00

runtime: deallocate specials before deallocating the underlying object.

R=dvyukov
CC=golang-codereviews
https://golang.org/cl/48840043
This commit is contained in:
Keith Randall 2014-01-08 12:41:26 -08:00
parent 89c5d17878
commit e7d010a6a7

View File

@ -180,16 +180,18 @@ runtime·free(void *v)
runtime·printf("free %p: not an allocated block\n", v);
runtime·throw("free runtime·mlookup");
}
size = s->elemsize;
sizeclass = s->sizeclass;
if(raceenabled)
runtime·racefree(v);
// Find size class for v.
sizeclass = s->sizeclass;
if(s->specials != nil)
runtime·freeallspecials(s, v, size);
c = m->mcache;
if(sizeclass == 0) {
// Large object.
size = s->npages<<PageShift;
*(uintptr*)(s->start<<PageShift) = (uintptr)0xfeedfeedfeedfeedll; // mark as "needs to be zeroed"
// Must mark v freed before calling unmarkspan and MHeap_Free:
// they might coalesce v into other spans and change the bitmap further.
@ -203,7 +205,6 @@ runtime·free(void *v)
c->local_largefree += size;
} else {
// Small object.
size = runtime·class_to_size[sizeclass];
if(size > sizeof(uintptr))
((uintptr*)v)[1] = (uintptr)0xfeedfeedfeedfeedll; // mark as "needs to be zeroed"
// Must mark v freed before calling MCache_Free:
@ -213,8 +214,6 @@ runtime·free(void *v)
c->local_nsmallfree[sizeclass]++;
runtime·MCache_Free(c, v, sizeclass, size);
}
if(s->specials != nil)
runtime·freeallspecials(s, v, size);
m->mallocing = 0;
}