mirror of
https://github.com/golang/go.git
synced 2024-09-22 10:58:58 +00:00
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
This commit is contained in:
parent
b039abfc3e
commit
d5a36cd6bb
@ -75,7 +75,7 @@ runtime·mallocgc(uintptr size, uintptr typ, uint32 flag)
|
||||
if(!(flag & FlagNoZero)) {
|
||||
v->next = nil;
|
||||
// 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);
|
||||
}
|
||||
c->local_cachealloc += size;
|
||||
@ -205,8 +205,10 @@ runtime·free(void *v)
|
||||
c->local_largefree += size;
|
||||
} else {
|
||||
// Small object.
|
||||
if(size > sizeof(uintptr))
|
||||
if(size > 2*sizeof(uintptr))
|
||||
((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:
|
||||
// it might coalesce v and other blocks into a bigger span
|
||||
// and change the bitmap further.
|
||||
|
@ -1867,9 +1867,11 @@ sweepspan(ParFor *desc, uint32 idx)
|
||||
*(byte*)type_data = 0;
|
||||
break;
|
||||
}
|
||||
if(size > sizeof(uintptr))
|
||||
if(size > 2*sizeof(uintptr))
|
||||
((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 = (MLink*)p;
|
||||
nfree++;
|
||||
|
Loading…
Reference in New Issue
Block a user