mirror of https://github.com/golang/go.git
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)) {
|
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)
|
||||||
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)
|
||||||
*(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++;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue