Commit d5a36cd6 authored by Dmitriy Vyukov's avatar Dmitriy Vyukov

runtime: zero 2-word memory blocks in-place

Currently for 2-word blocks we set the flag to clear the flag. Makes no sense.
In particular on 32-bits we call memclr always.

R=golang-codereviews, dave, iant
CC=golang-codereviews, khr, rsc
https://golang.org/cl/41170044
parent b039abfc
...@@ -75,7 +75,7 @@ runtime·mallocgc(uintptr size, uintptr typ, uint32 flag) ...@@ -75,7 +75,7 @@ runtime·mallocgc(uintptr size, uintptr typ, uint32 flag)
if(!(flag & FlagNoZero)) { if(!(flag & FlagNoZero)) {
v->next = nil; v->next = nil;
// block is zeroed iff second word is zero ... // block is zeroed iff second word is zero ...
if(size > sizeof(uintptr) && ((uintptr*)v)[1] != 0) if(size > 2*sizeof(uintptr) && ((uintptr*)v)[1] != 0)
runtime·memclr((byte*)v, size); runtime·memclr((byte*)v, size);
} }
c->local_cachealloc += size; c->local_cachealloc += size;
...@@ -205,8 +205,10 @@ runtime·free(void *v) ...@@ -205,8 +205,10 @@ runtime·free(void *v)
c->local_largefree += size; c->local_largefree += size;
} else { } else {
// Small object. // Small object.
if(size > sizeof(uintptr)) if(size > 2*sizeof(uintptr))
((uintptr*)v)[1] = (uintptr)0xfeedfeedfeedfeedll; // mark as "needs to be zeroed" ((uintptr*)v)[1] = (uintptr)0xfeedfeedfeedfeedll; // mark as "needs to be zeroed"
else if(size > sizeof(uintptr))
((uintptr*)v)[1] = 0;
// Must mark v freed before calling MCache_Free: // Must mark v freed before calling MCache_Free:
// it might coalesce v and other blocks into a bigger span // it might coalesce v and other blocks into a bigger span
// and change the bitmap further. // and change the bitmap further.
......
...@@ -1867,9 +1867,11 @@ sweepspan(ParFor *desc, uint32 idx) ...@@ -1867,9 +1867,11 @@ sweepspan(ParFor *desc, uint32 idx)
*(byte*)type_data = 0; *(byte*)type_data = 0;
break; break;
} }
if(size > sizeof(uintptr)) if(size > 2*sizeof(uintptr))
((uintptr*)p)[1] = (uintptr)0xdeaddeaddeaddeadll; // mark as "needs to be zeroed" ((uintptr*)p)[1] = (uintptr)0xdeaddeaddeaddeadll; // mark as "needs to be zeroed"
else if(size > sizeof(uintptr))
((uintptr*)p)[1] = 0;
end->next = (MLink*)p; end->next = (MLink*)p;
end = (MLink*)p; end = (MLink*)p;
nfree++; nfree++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment