aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2014-01-08 12:41:26 -0800
committerKeith Randall <khr@golang.org>2014-01-08 12:41:26 -0800
commite7d010a6a7c19c3af6a8157356d09cea23eab198 (patch)
tree0aa9ff99ca24f7f47a0f92f83a9474fe0cd0a049 /src
parent89c5d178785bd7884dbb14d73f85f600196d6cb6 (diff)
downloadgo-e7d010a6a7c19c3af6a8157356d09cea23eab198.tar.xz
runtime: deallocate specials before deallocating the underlying object.
R=dvyukov CC=golang-codereviews https://golang.org/cl/48840043
Diffstat (limited to 'src')
-rw-r--r--src/pkg/runtime/malloc.goc11
1 files changed, 5 insertions, 6 deletions
diff --git a/src/pkg/runtime/malloc.goc b/src/pkg/runtime/malloc.goc
index 81cda75dfd..9a25029586 100644
--- a/src/pkg/runtime/malloc.goc
+++ b/src/pkg/runtime/malloc.goc
@@ -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;
}