Commit c17c42e8 authored by Matthew Dempsky's avatar Matthew Dempsky

runtime: rewrite lots of foo_Bar(f, ...) into f.bar(...)

Applies to types fixAlloc, mCache, mCentral, mHeap, mSpan, and
mSpanList.

Two special cases:

1. mHeap_Scavenge() previously didn't take an *mheap parameter, so it
was specially handled in this CL.

2. mHeap_Free() would have collided with mheap's "free" field, so it's
been renamed to (*mheap).freeSpan to parallel its underlying
(*mheap).freeSpanLocked method.

Change-Id: I325938554cca432c166fe9d9d689af2bbd68de4b
Reviewed-on: https://go-review.googlesource.com/16221Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 58db5fc9
...@@ -643,7 +643,7 @@ func mdump() { ...@@ -643,7 +643,7 @@ func mdump() {
for i := uintptr(0); i < uintptr(mheap_.nspan); i++ { for i := uintptr(0); i < uintptr(mheap_.nspan); i++ {
s := h_allspans[i] s := h_allspans[i]
if s.state == _MSpanInUse { if s.state == _MSpanInUse {
mSpan_EnsureSwept(s) s.ensureSwept()
} }
} }
memclr(unsafe.Pointer(&typecache), unsafe.Sizeof(typecache)) memclr(unsafe.Pointer(&typecache), unsafe.Sizeof(typecache))
......
...@@ -76,9 +76,6 @@ ...@@ -76,9 +76,6 @@
// or the page heap can avoid zeroing altogether. // or the page heap can avoid zeroing altogether.
// 2. the cost of zeroing when reusing a small object is // 2. the cost of zeroing when reusing a small object is
// charged to the mutator, not the garbage collector. // charged to the mutator, not the garbage collector.
//
// This code was written with an eye toward translating to Go
// in the future. Methods have the form Type_Method(Type *t, ...).
package runtime package runtime
...@@ -359,7 +356,7 @@ func mallocinit() { ...@@ -359,7 +356,7 @@ func mallocinit() {
} }
// Initialize the rest of the allocator. // Initialize the rest of the allocator.
mHeap_Init(&mheap_, spansSize) mheap_.init(spansSize)
_g_ := getg() _g_ := getg()
_g_.m.mcache = allocmcache() _g_.m.mcache = allocmcache()
} }
...@@ -387,7 +384,7 @@ func sysReserveHigh(n uintptr, reserved *bool) unsafe.Pointer { ...@@ -387,7 +384,7 @@ func sysReserveHigh(n uintptr, reserved *bool) unsafe.Pointer {
return sysReserve(nil, n, reserved) return sysReserve(nil, n, reserved)
} }
func mHeap_SysAlloc(h *mheap, n uintptr) unsafe.Pointer { func (h *mheap) sysAlloc(n uintptr) unsafe.Pointer {
if n > h.arena_end-h.arena_used { if n > h.arena_end-h.arena_used {
// We are in 32-bit mode, maybe we didn't use all possible address space yet. // We are in 32-bit mode, maybe we didn't use all possible address space yet.
// Reserve some more space. // Reserve some more space.
...@@ -409,8 +406,8 @@ func mHeap_SysAlloc(h *mheap, n uintptr) unsafe.Pointer { ...@@ -409,8 +406,8 @@ func mHeap_SysAlloc(h *mheap, n uintptr) unsafe.Pointer {
// Our pages are bigger than hardware pages. // Our pages are bigger than hardware pages.
h.arena_end = p + p_size h.arena_end = p + p_size
used := p + (-uintptr(p) & (_PageSize - 1)) used := p + (-uintptr(p) & (_PageSize - 1))
mHeap_MapBits(h, used) h.mapBits(used)
mHeap_MapSpans(h, used) h.mapSpans(used)
h.arena_used = used h.arena_used = used
h.arena_reserved = reserved h.arena_reserved = reserved
} else { } else {
...@@ -424,8 +421,8 @@ func mHeap_SysAlloc(h *mheap, n uintptr) unsafe.Pointer { ...@@ -424,8 +421,8 @@ func mHeap_SysAlloc(h *mheap, n uintptr) unsafe.Pointer {
// Keep taking from our reservation. // Keep taking from our reservation.
p := h.arena_used p := h.arena_used
sysMap(unsafe.Pointer(p), n, h.arena_reserved, &memstats.heap_sys) sysMap(unsafe.Pointer(p), n, h.arena_reserved, &memstats.heap_sys)
mHeap_MapBits(h, p+n) h.mapBits(p + n)
mHeap_MapSpans(h, p+n) h.mapSpans(p + n)
h.arena_used = p + n h.arena_used = p + n
if raceenabled { if raceenabled {
racemapshadow(unsafe.Pointer(p), n) racemapshadow(unsafe.Pointer(p), n)
...@@ -460,8 +457,8 @@ func mHeap_SysAlloc(h *mheap, n uintptr) unsafe.Pointer { ...@@ -460,8 +457,8 @@ func mHeap_SysAlloc(h *mheap, n uintptr) unsafe.Pointer {
p_end := p + p_size p_end := p + p_size
p += -p & (_PageSize - 1) p += -p & (_PageSize - 1)
if uintptr(p)+n > h.arena_used { if uintptr(p)+n > h.arena_used {
mHeap_MapBits(h, p+n) h.mapBits(p + n)
mHeap_MapSpans(h, p+n) h.mapSpans(p + n)
h.arena_used = p + n h.arena_used = p + n
if p_end > h.arena_end { if p_end > h.arena_end {
h.arena_end = p_end h.arena_end = p_end
...@@ -600,7 +597,7 @@ func mallocgc(size uintptr, typ *_type, flags uint32) unsafe.Pointer { ...@@ -600,7 +597,7 @@ func mallocgc(size uintptr, typ *_type, flags uint32) unsafe.Pointer {
v := s.freelist v := s.freelist
if v.ptr() == nil { if v.ptr() == nil {
systemstack(func() { systemstack(func() {
mCache_Refill(c, tinySizeClass) c.refill(tinySizeClass)
}) })
shouldhelpgc = true shouldhelpgc = true
s = c.alloc[tinySizeClass] s = c.alloc[tinySizeClass]
...@@ -632,7 +629,7 @@ func mallocgc(size uintptr, typ *_type, flags uint32) unsafe.Pointer { ...@@ -632,7 +629,7 @@ func mallocgc(size uintptr, typ *_type, flags uint32) unsafe.Pointer {
v := s.freelist v := s.freelist
if v.ptr() == nil { if v.ptr() == nil {
systemstack(func() { systemstack(func() {
mCache_Refill(c, int32(sizeclass)) c.refill(int32(sizeclass))
}) })
shouldhelpgc = true shouldhelpgc = true
s = c.alloc[sizeclass] s = c.alloc[sizeclass]
...@@ -757,7 +754,7 @@ func largeAlloc(size uintptr, flag uint32) *mspan { ...@@ -757,7 +754,7 @@ func largeAlloc(size uintptr, flag uint32) *mspan {
// pays the debt down to npage pages. // pays the debt down to npage pages.
deductSweepCredit(npages*_PageSize, npages) deductSweepCredit(npages*_PageSize, npages)
s := mHeap_Alloc(&mheap_, npages, 0, true, flag&_FlagNoZero == 0) s := mheap_.alloc(npages, 0, true, flag&_FlagNoZero == 0)
if s == nil { if s == nil {
throw("out of memory") throw("out of memory")
} }
......
...@@ -131,7 +131,7 @@ func subtract1(p *byte) *byte { ...@@ -131,7 +131,7 @@ func subtract1(p *byte) *byte {
// after observing the change to arena_used. // after observing the change to arena_used.
// //
//go:nowritebarrier //go:nowritebarrier
func mHeap_MapBits(h *mheap, arena_used uintptr) { func (h *mheap) mapBits(arena_used uintptr) {
// Caller has added extra mappings to the arena. // Caller has added extra mappings to the arena.
// Add extra mappings of bitmap words as needed. // Add extra mappings of bitmap words as needed.
// We allocate extra bitmap pieces in chunks of bitmapChunk. // We allocate extra bitmap pieces in chunks of bitmapChunk.
......
...@@ -63,7 +63,7 @@ var emptymspan mspan ...@@ -63,7 +63,7 @@ var emptymspan mspan
func allocmcache() *mcache { func allocmcache() *mcache {
lock(&mheap_.lock) lock(&mheap_.lock)
c := (*mcache)(fixAlloc_Alloc(&mheap_.cachealloc)) c := (*mcache)(mheap_.cachealloc.alloc())
unlock(&mheap_.lock) unlock(&mheap_.lock)
memclr(unsafe.Pointer(c), unsafe.Sizeof(*c)) memclr(unsafe.Pointer(c), unsafe.Sizeof(*c))
for i := 0; i < _NumSizeClasses; i++ { for i := 0; i < _NumSizeClasses; i++ {
...@@ -75,7 +75,7 @@ func allocmcache() *mcache { ...@@ -75,7 +75,7 @@ func allocmcache() *mcache {
func freemcache(c *mcache) { func freemcache(c *mcache) {
systemstack(func() { systemstack(func() {
mCache_ReleaseAll(c) c.releaseAll()
stackcache_clear(c) stackcache_clear(c)
// NOTE(rsc,rlh): If gcworkbuffree comes back, we need to coordinate // NOTE(rsc,rlh): If gcworkbuffree comes back, we need to coordinate
...@@ -85,14 +85,14 @@ func freemcache(c *mcache) { ...@@ -85,14 +85,14 @@ func freemcache(c *mcache) {
lock(&mheap_.lock) lock(&mheap_.lock)
purgecachedstats(c) purgecachedstats(c)
fixAlloc_Free(&mheap_.cachealloc, unsafe.Pointer(c)) mheap_.cachealloc.free(unsafe.Pointer(c))
unlock(&mheap_.lock) unlock(&mheap_.lock)
}) })
} }
// Gets a span that has a free object in it and assigns it // Gets a span that has a free object in it and assigns it
// to be the cached span for the given sizeclass. Returns this span. // to be the cached span for the given sizeclass. Returns this span.
func mCache_Refill(c *mcache, sizeclass int32) *mspan { func (c *mcache) refill(sizeclass int32) *mspan {
_g_ := getg() _g_ := getg()
_g_.m.locks++ _g_.m.locks++
...@@ -106,7 +106,7 @@ func mCache_Refill(c *mcache, sizeclass int32) *mspan { ...@@ -106,7 +106,7 @@ func mCache_Refill(c *mcache, sizeclass int32) *mspan {
} }
// Get a new cached span from the central lists. // Get a new cached span from the central lists.
s = mCentral_CacheSpan(&mheap_.central[sizeclass].mcentral) s = mheap_.central[sizeclass].mcentral.cacheSpan()
if s == nil { if s == nil {
throw("out of memory") throw("out of memory")
} }
...@@ -119,11 +119,11 @@ func mCache_Refill(c *mcache, sizeclass int32) *mspan { ...@@ -119,11 +119,11 @@ func mCache_Refill(c *mcache, sizeclass int32) *mspan {
return s return s
} }
func mCache_ReleaseAll(c *mcache) { func (c *mcache) releaseAll() {
for i := 0; i < _NumSizeClasses; i++ { for i := 0; i < _NumSizeClasses; i++ {
s := c.alloc[i] s := c.alloc[i]
if s != &emptymspan { if s != &emptymspan {
mCentral_UncacheSpan(&mheap_.central[i].mcentral, s) mheap_.central[i].mcentral.uncacheSpan(s)
c.alloc[i] = &emptymspan c.alloc[i] = &emptymspan
} }
} }
......
...@@ -23,14 +23,14 @@ type mcentral struct { ...@@ -23,14 +23,14 @@ type mcentral struct {
} }
// Initialize a single central free list. // Initialize a single central free list.
func mCentral_Init(c *mcentral, sizeclass int32) { func (c *mcentral) init(sizeclass int32) {
c.sizeclass = sizeclass c.sizeclass = sizeclass
mSpanList_Init(&c.nonempty) c.nonempty.init()
mSpanList_Init(&c.empty) c.empty.init()
} }
// Allocate a span to use in an MCache. // Allocate a span to use in an MCache.
func mCentral_CacheSpan(c *mcentral) *mspan { func (c *mcentral) cacheSpan() *mspan {
// Deduct credit for this span allocation and sweep if necessary. // Deduct credit for this span allocation and sweep if necessary.
deductSweepCredit(uintptr(class_to_size[c.sizeclass]), 0) deductSweepCredit(uintptr(class_to_size[c.sizeclass]), 0)
...@@ -40,10 +40,10 @@ retry: ...@@ -40,10 +40,10 @@ retry:
var s *mspan var s *mspan
for s = c.nonempty.first; s != nil; s = s.next { for s = c.nonempty.first; s != nil; s = s.next {
if s.sweepgen == sg-2 && atomic.Cas(&s.sweepgen, sg-2, sg-1) { if s.sweepgen == sg-2 && atomic.Cas(&s.sweepgen, sg-2, sg-1) {
mSpanList_Remove(&c.nonempty, s) c.nonempty.remove(s)
mSpanList_InsertBack(&c.empty, s) c.empty.insertBack(s)
unlock(&c.lock) unlock(&c.lock)
mSpan_Sweep(s, true) s.sweep(true)
goto havespan goto havespan
} }
if s.sweepgen == sg-1 { if s.sweepgen == sg-1 {
...@@ -51,8 +51,8 @@ retry: ...@@ -51,8 +51,8 @@ retry:
continue continue
} }
// we have a nonempty span that does not require sweeping, allocate from it // we have a nonempty span that does not require sweeping, allocate from it
mSpanList_Remove(&c.nonempty, s) c.nonempty.remove(s)
mSpanList_InsertBack(&c.empty, s) c.empty.insertBack(s)
unlock(&c.lock) unlock(&c.lock)
goto havespan goto havespan
} }
...@@ -61,11 +61,11 @@ retry: ...@@ -61,11 +61,11 @@ retry:
if s.sweepgen == sg-2 && atomic.Cas(&s.sweepgen, sg-2, sg-1) { if s.sweepgen == sg-2 && atomic.Cas(&s.sweepgen, sg-2, sg-1) {
// we have an empty span that requires sweeping, // we have an empty span that requires sweeping,
// sweep it and see if we can free some space in it // sweep it and see if we can free some space in it
mSpanList_Remove(&c.empty, s) c.empty.remove(s)
// swept spans are at the end of the list // swept spans are at the end of the list
mSpanList_InsertBack(&c.empty, s) c.empty.insertBack(s)
unlock(&c.lock) unlock(&c.lock)
mSpan_Sweep(s, true) s.sweep(true)
if s.freelist.ptr() != nil { if s.freelist.ptr() != nil {
goto havespan goto havespan
} }
...@@ -85,12 +85,12 @@ retry: ...@@ -85,12 +85,12 @@ retry:
unlock(&c.lock) unlock(&c.lock)
// Replenish central list if empty. // Replenish central list if empty.
s = mCentral_Grow(c) s = c.grow()
if s == nil { if s == nil {
return nil return nil
} }
lock(&c.lock) lock(&c.lock)
mSpanList_InsertBack(&c.empty, s) c.empty.insertBack(s)
unlock(&c.lock) unlock(&c.lock)
// At this point s is a non-empty span, queued at the end of the empty list, // At this point s is a non-empty span, queued at the end of the empty list,
...@@ -113,7 +113,7 @@ havespan: ...@@ -113,7 +113,7 @@ havespan:
} }
// Return span from an MCache. // Return span from an MCache.
func mCentral_UncacheSpan(c *mcentral, s *mspan) { func (c *mcentral) uncacheSpan(s *mspan) {
lock(&c.lock) lock(&c.lock)
s.incache = false s.incache = false
...@@ -125,8 +125,8 @@ func mCentral_UncacheSpan(c *mcentral, s *mspan) { ...@@ -125,8 +125,8 @@ func mCentral_UncacheSpan(c *mcentral, s *mspan) {
cap := int32((s.npages << _PageShift) / s.elemsize) cap := int32((s.npages << _PageShift) / s.elemsize)
n := cap - int32(s.ref) n := cap - int32(s.ref)
if n > 0 { if n > 0 {
mSpanList_Remove(&c.empty, s) c.empty.remove(s)
mSpanList_Insert(&c.nonempty, s) c.nonempty.insert(s)
} }
unlock(&c.lock) unlock(&c.lock)
} }
...@@ -137,7 +137,7 @@ func mCentral_UncacheSpan(c *mcentral, s *mspan) { ...@@ -137,7 +137,7 @@ func mCentral_UncacheSpan(c *mcentral, s *mspan) {
// the latest generation. // the latest generation.
// If preserve=true, don't return the span to heap nor relink in MCentral lists; // If preserve=true, don't return the span to heap nor relink in MCentral lists;
// caller takes care of it. // caller takes care of it.
func mCentral_FreeSpan(c *mcentral, s *mspan, n int32, start gclinkptr, end gclinkptr, preserve bool) bool { func (c *mcentral) freeSpan(s *mspan, n int32, start gclinkptr, end gclinkptr, preserve bool) bool {
if s.incache { if s.incache {
throw("freespan into cached span") throw("freespan into cached span")
} }
...@@ -151,7 +151,7 @@ func mCentral_FreeSpan(c *mcentral, s *mspan, n int32, start gclinkptr, end gcli ...@@ -151,7 +151,7 @@ func mCentral_FreeSpan(c *mcentral, s *mspan, n int32, start gclinkptr, end gcli
if preserve { if preserve {
// preserve is set only when called from MCentral_CacheSpan above, // preserve is set only when called from MCentral_CacheSpan above,
// the span must be in the empty list. // the span must be in the empty list.
if !mSpan_InList(s) { if !s.inList() {
throw("can't preserve unlinked span") throw("can't preserve unlinked span")
} }
atomic.Store(&s.sweepgen, mheap_.sweepgen) atomic.Store(&s.sweepgen, mheap_.sweepgen)
...@@ -162,8 +162,8 @@ func mCentral_FreeSpan(c *mcentral, s *mspan, n int32, start gclinkptr, end gcli ...@@ -162,8 +162,8 @@ func mCentral_FreeSpan(c *mcentral, s *mspan, n int32, start gclinkptr, end gcli
// Move to nonempty if necessary. // Move to nonempty if necessary.
if wasempty { if wasempty {
mSpanList_Remove(&c.empty, s) c.empty.remove(s)
mSpanList_Insert(&c.nonempty, s) c.nonempty.insert(s)
} }
// delay updating sweepgen until here. This is the signal that // delay updating sweepgen until here. This is the signal that
...@@ -178,22 +178,22 @@ func mCentral_FreeSpan(c *mcentral, s *mspan, n int32, start gclinkptr, end gcli ...@@ -178,22 +178,22 @@ func mCentral_FreeSpan(c *mcentral, s *mspan, n int32, start gclinkptr, end gcli
} }
// s is completely freed, return it to the heap. // s is completely freed, return it to the heap.
mSpanList_Remove(&c.nonempty, s) c.nonempty.remove(s)
s.needzero = 1 s.needzero = 1
s.freelist = 0 s.freelist = 0
unlock(&c.lock) unlock(&c.lock)
heapBitsForSpan(s.base()).initSpan(s.layout()) heapBitsForSpan(s.base()).initSpan(s.layout())
mHeap_Free(&mheap_, s, 0) mheap_.freeSpan(s, 0)
return true return true
} }
// Fetch a new span from the heap and carve into objects for the free list. // Fetch a new span from the heap and carve into objects for the free list.
func mCentral_Grow(c *mcentral) *mspan { func (c *mcentral) grow() *mspan {
npages := uintptr(class_to_allocnpages[c.sizeclass]) npages := uintptr(class_to_allocnpages[c.sizeclass])
size := uintptr(class_to_size[c.sizeclass]) size := uintptr(class_to_size[c.sizeclass])
n := (npages << _PageShift) / size n := (npages << _PageShift) / size
s := mHeap_Alloc(&mheap_, npages, c.sizeclass, false, true) s := mheap_.alloc(npages, c.sizeclass, false, true)
if s == nil { if s == nil {
return nil return nil
} }
......
...@@ -40,7 +40,7 @@ type mlink struct { ...@@ -40,7 +40,7 @@ type mlink struct {
// Initialize f to allocate objects of the given size, // Initialize f to allocate objects of the given size,
// using the allocator to obtain chunks of memory. // using the allocator to obtain chunks of memory.
func fixAlloc_Init(f *fixalloc, size uintptr, first func(arg, p unsafe.Pointer), arg unsafe.Pointer, stat *uint64) { func (f *fixalloc) init(size uintptr, first func(arg, p unsafe.Pointer), arg unsafe.Pointer, stat *uint64) {
f.size = size f.size = size
f.first = first f.first = first
f.arg = arg f.arg = arg
...@@ -51,7 +51,7 @@ func fixAlloc_Init(f *fixalloc, size uintptr, first func(arg, p unsafe.Pointer), ...@@ -51,7 +51,7 @@ func fixAlloc_Init(f *fixalloc, size uintptr, first func(arg, p unsafe.Pointer),
f.stat = stat f.stat = stat
} }
func fixAlloc_Alloc(f *fixalloc) unsafe.Pointer { func (f *fixalloc) alloc() unsafe.Pointer {
if f.size == 0 { if f.size == 0 {
print("runtime: use of FixAlloc_Alloc before FixAlloc_Init\n") print("runtime: use of FixAlloc_Alloc before FixAlloc_Init\n")
throw("runtime: internal error") throw("runtime: internal error")
...@@ -78,7 +78,7 @@ func fixAlloc_Alloc(f *fixalloc) unsafe.Pointer { ...@@ -78,7 +78,7 @@ func fixAlloc_Alloc(f *fixalloc) unsafe.Pointer {
return v return v
} }
func fixAlloc_Free(f *fixalloc, p unsafe.Pointer) { func (f *fixalloc) free(p unsafe.Pointer) {
f.inuse -= f.size f.inuse -= f.size
v := (*mlink)(p) v := (*mlink)(p)
v.next = f.list v.next = f.list
......
...@@ -47,7 +47,7 @@ func finishsweep_m(stw bool) { ...@@ -47,7 +47,7 @@ func finishsweep_m(stw bool) {
sg := mheap_.sweepgen sg := mheap_.sweepgen
for _, s := range work.spans { for _, s := range work.spans {
if s.sweepgen != sg && s.state == _MSpanInUse { if s.sweepgen != sg && s.state == _MSpanInUse {
mSpan_EnsureSwept(s) s.ensureSwept()
} }
} }
} }
...@@ -105,7 +105,7 @@ func sweepone() uintptr { ...@@ -105,7 +105,7 @@ func sweepone() uintptr {
continue continue
} }
npages := s.npages npages := s.npages
if !mSpan_Sweep(s, false) { if !s.sweep(false) {
npages = 0 npages = 0
} }
_g_.m.locks-- _g_.m.locks--
...@@ -129,7 +129,7 @@ func gosweepdone() bool { ...@@ -129,7 +129,7 @@ func gosweepdone() bool {
// Returns only when span s has been swept. // Returns only when span s has been swept.
//go:nowritebarrier //go:nowritebarrier
func mSpan_EnsureSwept(s *mspan) { func (s *mspan) ensureSwept() {
// Caller must disable preemption. // Caller must disable preemption.
// Otherwise when this function returns the span can become unswept again // Otherwise when this function returns the span can become unswept again
// (if GC is triggered on another goroutine). // (if GC is triggered on another goroutine).
...@@ -144,7 +144,7 @@ func mSpan_EnsureSwept(s *mspan) { ...@@ -144,7 +144,7 @@ func mSpan_EnsureSwept(s *mspan) {
} }
// The caller must be sure that the span is a MSpanInUse span. // The caller must be sure that the span is a MSpanInUse span.
if atomic.Cas(&s.sweepgen, sg-2, sg-1) { if atomic.Cas(&s.sweepgen, sg-2, sg-1) {
mSpan_Sweep(s, false) s.sweep(false)
return return
} }
// unfortunate condition, and we don't have efficient means to wait // unfortunate condition, and we don't have efficient means to wait
...@@ -159,7 +159,7 @@ func mSpan_EnsureSwept(s *mspan) { ...@@ -159,7 +159,7 @@ func mSpan_EnsureSwept(s *mspan) {
// If preserve=true, don't return it to heap nor relink in MCentral lists; // If preserve=true, don't return it to heap nor relink in MCentral lists;
// caller takes care of it. // caller takes care of it.
//TODO go:nowritebarrier //TODO go:nowritebarrier
func mSpan_Sweep(s *mspan, preserve bool) bool { func (s *mspan) sweep(preserve bool) bool {
// It's critical that we enter this function with preemption disabled, // It's critical that we enter this function with preemption disabled,
// GC must not start while we are in the middle of this function. // GC must not start while we are in the middle of this function.
_g_ := getg() _g_ := getg()
...@@ -312,7 +312,7 @@ func mSpan_Sweep(s *mspan, preserve bool) bool { ...@@ -312,7 +312,7 @@ func mSpan_Sweep(s *mspan, preserve bool) bool {
} }
if nfree > 0 { if nfree > 0 {
c.local_nsmallfree[cl] += uintptr(nfree) c.local_nsmallfree[cl] += uintptr(nfree)
res = mCentral_FreeSpan(&mheap_.central[cl].mcentral, s, int32(nfree), head, end, preserve) res = mheap_.central[cl].mcentral.freeSpan(s, int32(nfree), head, end, preserve)
// MCentral_FreeSpan updates sweepgen // MCentral_FreeSpan updates sweepgen
} else if freeToHeap { } else if freeToHeap {
// Free large span to heap // Free large span to heap
...@@ -335,7 +335,7 @@ func mSpan_Sweep(s *mspan, preserve bool) bool { ...@@ -335,7 +335,7 @@ func mSpan_Sweep(s *mspan, preserve bool) bool {
s.limit = 0 // prevent mlookup from finding this span s.limit = 0 // prevent mlookup from finding this span
sysFault(unsafe.Pointer(uintptr(s.start<<_PageShift)), size) sysFault(unsafe.Pointer(uintptr(s.start<<_PageShift)), size)
} else { } else {
mHeap_Free(&mheap_, s, 1) mheap_.freeSpan(s, 1)
} }
c.local_nlargefree++ c.local_nlargefree++
c.local_largefree += size c.local_largefree += size
......
This diff is collapsed.
...@@ -325,7 +325,7 @@ func flushallmcaches() { ...@@ -325,7 +325,7 @@ func flushallmcaches() {
if c == nil { if c == nil {
continue continue
} }
mCache_ReleaseAll(c) c.releaseAll()
stackcache_clear(c) stackcache_clear(c)
} }
} }
......
...@@ -3379,7 +3379,7 @@ func sysmon() { ...@@ -3379,7 +3379,7 @@ func sysmon() {
} }
// scavenge heap once in a while // scavenge heap once in a while
if lastscavenge+scavengelimit/2 < now { if lastscavenge+scavengelimit/2 < now {
mHeap_Scavenge(int32(nscavenge), uint64(now), uint64(scavengelimit)) mheap_.scavenge(int32(nscavenge), uint64(now), uint64(scavengelimit))
lastscavenge = now lastscavenge = now
nscavenge++ nscavenge++
} }
......
...@@ -160,9 +160,9 @@ func stackinit() { ...@@ -160,9 +160,9 @@ func stackinit() {
throw("cache size must be a multiple of page size") throw("cache size must be a multiple of page size")
} }
for i := range stackpool { for i := range stackpool {
mSpanList_Init(&stackpool[i]) stackpool[i].init()
} }
mSpanList_Init(&stackFreeQueue) stackFreeQueue.init()
} }
// Allocates a stack from the free pool. Must be called with // Allocates a stack from the free pool. Must be called with
...@@ -172,7 +172,7 @@ func stackpoolalloc(order uint8) gclinkptr { ...@@ -172,7 +172,7 @@ func stackpoolalloc(order uint8) gclinkptr {
s := list.first s := list.first
if s == nil { if s == nil {
// no free stacks. Allocate another span worth. // no free stacks. Allocate another span worth.
s = mHeap_AllocStack(&mheap_, _StackCacheSize>>_PageShift) s = mheap_.allocStack(_StackCacheSize >> _PageShift)
if s == nil { if s == nil {
throw("out of memory") throw("out of memory")
} }
...@@ -187,7 +187,7 @@ func stackpoolalloc(order uint8) gclinkptr { ...@@ -187,7 +187,7 @@ func stackpoolalloc(order uint8) gclinkptr {
x.ptr().next = s.freelist x.ptr().next = s.freelist
s.freelist = x s.freelist = x
} }
mSpanList_Insert(list, s) list.insert(s)
} }
x := s.freelist x := s.freelist
if x.ptr() == nil { if x.ptr() == nil {
...@@ -197,20 +197,20 @@ func stackpoolalloc(order uint8) gclinkptr { ...@@ -197,20 +197,20 @@ func stackpoolalloc(order uint8) gclinkptr {
s.ref++ s.ref++
if s.freelist.ptr() == nil { if s.freelist.ptr() == nil {
// all stacks in s are allocated. // all stacks in s are allocated.
mSpanList_Remove(list, s) list.remove(s)
} }
return x return x
} }
// Adds stack x to the free pool. Must be called with stackpoolmu held. // Adds stack x to the free pool. Must be called with stackpoolmu held.
func stackpoolfree(x gclinkptr, order uint8) { func stackpoolfree(x gclinkptr, order uint8) {
s := mHeap_Lookup(&mheap_, unsafe.Pointer(x)) s := mheap_.lookup(unsafe.Pointer(x))
if s.state != _MSpanStack { if s.state != _MSpanStack {
throw("freeing stack not in a stack span") throw("freeing stack not in a stack span")
} }
if s.freelist.ptr() == nil { if s.freelist.ptr() == nil {
// s will now have a free stack // s will now have a free stack
mSpanList_Insert(&stackpool[order], s) stackpool[order].insert(s)
} }
x.ptr().next = s.freelist x.ptr().next = s.freelist
s.freelist = x s.freelist = x
...@@ -231,9 +231,9 @@ func stackpoolfree(x gclinkptr, order uint8) { ...@@ -231,9 +231,9 @@ func stackpoolfree(x gclinkptr, order uint8) {
// pointer into a free span. // pointer into a free span.
// //
// By not freeing, we prevent step #4 until GC is done. // By not freeing, we prevent step #4 until GC is done.
mSpanList_Remove(&stackpool[order], s) stackpool[order].remove(s)
s.freelist = 0 s.freelist = 0
mHeap_FreeStack(&mheap_, s) mheap_.freeStack(s)
} }
} }
...@@ -357,7 +357,7 @@ func stackalloc(n uint32) (stack, []stkbar) { ...@@ -357,7 +357,7 @@ func stackalloc(n uint32) (stack, []stkbar) {
} }
v = unsafe.Pointer(x) v = unsafe.Pointer(x)
} else { } else {
s := mHeap_AllocStack(&mheap_, round(uintptr(n), _PageSize)>>_PageShift) s := mheap_.allocStack(round(uintptr(n), _PageSize) >> _PageShift)
if s == nil { if s == nil {
throw("out of memory") throw("out of memory")
} }
...@@ -424,7 +424,7 @@ func stackfree(stk stack, n uintptr) { ...@@ -424,7 +424,7 @@ func stackfree(stk stack, n uintptr) {
c.stackcache[order].size += n c.stackcache[order].size += n
} }
} else { } else {
s := mHeap_Lookup(&mheap_, v) s := mheap_.lookup(v)
if s.state != _MSpanStack { if s.state != _MSpanStack {
println(hex(s.start<<_PageShift), v) println(hex(s.start<<_PageShift), v)
throw("bad span state") throw("bad span state")
...@@ -432,7 +432,7 @@ func stackfree(stk stack, n uintptr) { ...@@ -432,7 +432,7 @@ func stackfree(stk stack, n uintptr) {
if gcphase == _GCoff { if gcphase == _GCoff {
// Free the stack immediately if we're // Free the stack immediately if we're
// sweeping. // sweeping.
mHeap_FreeStack(&mheap_, s) mheap_.freeStack(s)
} else { } else {
// Otherwise, add it to a list of stack spans // Otherwise, add it to a list of stack spans
// to be freed at the end of GC. // to be freed at the end of GC.
...@@ -441,7 +441,7 @@ func stackfree(stk stack, n uintptr) { ...@@ -441,7 +441,7 @@ func stackfree(stk stack, n uintptr) {
// these spans as stacks, like we do for small // these spans as stacks, like we do for small
// stack spans. (See issue #11466.) // stack spans. (See issue #11466.)
lock(&stackpoolmu) lock(&stackpoolmu)
mSpanList_Insert(&stackFreeQueue, s) stackFreeQueue.insert(s)
unlock(&stackpoolmu) unlock(&stackpoolmu)
} }
} }
...@@ -1001,19 +1001,19 @@ func freeStackSpans() { ...@@ -1001,19 +1001,19 @@ func freeStackSpans() {
for s := list.first; s != nil; { for s := list.first; s != nil; {
next := s.next next := s.next
if s.ref == 0 { if s.ref == 0 {
mSpanList_Remove(list, s) list.remove(s)
s.freelist = 0 s.freelist = 0
mHeap_FreeStack(&mheap_, s) mheap_.freeStack(s)
} }
s = next s = next
} }
} }
// Free queued stack spans. // Free queued stack spans.
for !mSpanList_IsEmpty(&stackFreeQueue) { for !stackFreeQueue.isEmpty() {
s := stackFreeQueue.first s := stackFreeQueue.first
mSpanList_Remove(&stackFreeQueue, s) stackFreeQueue.remove(s)
mHeap_FreeStack(&mheap_, s) mheap_.freeStack(s)
} }
unlock(&stackpoolmu) unlock(&stackpoolmu)
......
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