Skip to content

Commit

Permalink
runtime: rewrite lots of foo_Bar(f, ...) into f.bar(...)
Browse files Browse the repository at this point in the history
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/16221
Reviewed-by: Ian Lance Taylor <[email protected]>
Run-TryBot: Matthew Dempsky <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
  • Loading branch information
mdempsky committed Nov 12, 2015
1 parent 58db5fc commit c17c42e
Show file tree
Hide file tree
Showing 11 changed files with 158 additions and 162 deletions.
2 changes: 1 addition & 1 deletion src/runtime/heapdump.go
Original file line number Diff line number Diff line change
Expand Up @@ -643,7 +643,7 @@ func mdump() {
for i := uintptr(0); i < uintptr(mheap_.nspan); i++ {
s := h_allspans[i]
if s.state == _MSpanInUse {
mSpan_EnsureSwept(s)
s.ensureSwept()
}
}
memclr(unsafe.Pointer(&typecache), unsafe.Sizeof(typecache))
Expand Down
25 changes: 11 additions & 14 deletions src/runtime/malloc.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,6 @@
// or the page heap can avoid zeroing altogether.
// 2. the cost of zeroing when reusing a small object is
// 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

Expand Down Expand Up @@ -359,7 +356,7 @@ func mallocinit() {
}

// Initialize the rest of the allocator.
mHeap_Init(&mheap_, spansSize)
mheap_.init(spansSize)
_g_ := getg()
_g_.m.mcache = allocmcache()
}
Expand Down Expand Up @@ -387,7 +384,7 @@ func sysReserveHigh(n uintptr, reserved *bool) unsafe.Pointer {
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 {
// We are in 32-bit mode, maybe we didn't use all possible address space yet.
// Reserve some more space.
Expand All @@ -409,8 +406,8 @@ func mHeap_SysAlloc(h *mheap, n uintptr) unsafe.Pointer {
// Our pages are bigger than hardware pages.
h.arena_end = p + p_size
used := p + (-uintptr(p) & (_PageSize - 1))
mHeap_MapBits(h, used)
mHeap_MapSpans(h, used)
h.mapBits(used)
h.mapSpans(used)
h.arena_used = used
h.arena_reserved = reserved
} else {
Expand All @@ -424,8 +421,8 @@ func mHeap_SysAlloc(h *mheap, n uintptr) unsafe.Pointer {
// Keep taking from our reservation.
p := h.arena_used
sysMap(unsafe.Pointer(p), n, h.arena_reserved, &memstats.heap_sys)
mHeap_MapBits(h, p+n)
mHeap_MapSpans(h, p+n)
h.mapBits(p + n)
h.mapSpans(p + n)
h.arena_used = p + n
if raceenabled {
racemapshadow(unsafe.Pointer(p), n)
Expand Down Expand Up @@ -460,8 +457,8 @@ func mHeap_SysAlloc(h *mheap, n uintptr) unsafe.Pointer {
p_end := p + p_size
p += -p & (_PageSize - 1)
if uintptr(p)+n > h.arena_used {
mHeap_MapBits(h, p+n)
mHeap_MapSpans(h, p+n)
h.mapBits(p + n)
h.mapSpans(p + n)
h.arena_used = p + n
if p_end > h.arena_end {
h.arena_end = p_end
Expand Down Expand Up @@ -600,7 +597,7 @@ func mallocgc(size uintptr, typ *_type, flags uint32) unsafe.Pointer {
v := s.freelist
if v.ptr() == nil {
systemstack(func() {
mCache_Refill(c, tinySizeClass)
c.refill(tinySizeClass)
})
shouldhelpgc = true
s = c.alloc[tinySizeClass]
Expand Down Expand Up @@ -632,7 +629,7 @@ func mallocgc(size uintptr, typ *_type, flags uint32) unsafe.Pointer {
v := s.freelist
if v.ptr() == nil {
systemstack(func() {
mCache_Refill(c, int32(sizeclass))
c.refill(int32(sizeclass))
})
shouldhelpgc = true
s = c.alloc[sizeclass]
Expand Down Expand Up @@ -757,7 +754,7 @@ func largeAlloc(size uintptr, flag uint32) *mspan {
// pays the debt down to npage pages.
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 {
throw("out of memory")
}
Expand Down
2 changes: 1 addition & 1 deletion src/runtime/mbitmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ func subtract1(p *byte) *byte {
// after observing the change to arena_used.
//
//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.
// Add extra mappings of bitmap words as needed.
// We allocate extra bitmap pieces in chunks of bitmapChunk.
Expand Down
14 changes: 7 additions & 7 deletions src/runtime/mcache.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ var emptymspan mspan

func allocmcache() *mcache {
lock(&mheap_.lock)
c := (*mcache)(fixAlloc_Alloc(&mheap_.cachealloc))
c := (*mcache)(mheap_.cachealloc.alloc())
unlock(&mheap_.lock)
memclr(unsafe.Pointer(c), unsafe.Sizeof(*c))
for i := 0; i < _NumSizeClasses; i++ {
Expand All @@ -75,7 +75,7 @@ func allocmcache() *mcache {

func freemcache(c *mcache) {
systemstack(func() {
mCache_ReleaseAll(c)
c.releaseAll()
stackcache_clear(c)

// NOTE(rsc,rlh): If gcworkbuffree comes back, we need to coordinate
Expand All @@ -85,14 +85,14 @@ func freemcache(c *mcache) {

lock(&mheap_.lock)
purgecachedstats(c)
fixAlloc_Free(&mheap_.cachealloc, unsafe.Pointer(c))
mheap_.cachealloc.free(unsafe.Pointer(c))
unlock(&mheap_.lock)
})
}

// 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.
func mCache_Refill(c *mcache, sizeclass int32) *mspan {
func (c *mcache) refill(sizeclass int32) *mspan {
_g_ := getg()

_g_.m.locks++
Expand All @@ -106,7 +106,7 @@ func mCache_Refill(c *mcache, sizeclass int32) *mspan {
}

// 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 {
throw("out of memory")
}
Expand All @@ -119,11 +119,11 @@ func mCache_Refill(c *mcache, sizeclass int32) *mspan {
return s
}

func mCache_ReleaseAll(c *mcache) {
func (c *mcache) releaseAll() {
for i := 0; i < _NumSizeClasses; i++ {
s := c.alloc[i]
if s != &emptymspan {
mCentral_UncacheSpan(&mheap_.central[i].mcentral, s)
mheap_.central[i].mcentral.uncacheSpan(s)
c.alloc[i] = &emptymspan
}
}
Expand Down
50 changes: 25 additions & 25 deletions src/runtime/mcentral.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@ type mcentral struct {
}

// Initialize a single central free list.
func mCentral_Init(c *mcentral, sizeclass int32) {
func (c *mcentral) init(sizeclass int32) {
c.sizeclass = sizeclass
mSpanList_Init(&c.nonempty)
mSpanList_Init(&c.empty)
c.nonempty.init()
c.empty.init()
}

// 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.
deductSweepCredit(uintptr(class_to_size[c.sizeclass]), 0)

Expand All @@ -40,19 +40,19 @@ retry:
var s *mspan
for s = c.nonempty.first; s != nil; s = s.next {
if s.sweepgen == sg-2 && atomic.Cas(&s.sweepgen, sg-2, sg-1) {
mSpanList_Remove(&c.nonempty, s)
mSpanList_InsertBack(&c.empty, s)
c.nonempty.remove(s)
c.empty.insertBack(s)
unlock(&c.lock)
mSpan_Sweep(s, true)
s.sweep(true)
goto havespan
}
if s.sweepgen == sg-1 {
// the span is being swept by background sweeper, skip
continue
}
// we have a nonempty span that does not require sweeping, allocate from it
mSpanList_Remove(&c.nonempty, s)
mSpanList_InsertBack(&c.empty, s)
c.nonempty.remove(s)
c.empty.insertBack(s)
unlock(&c.lock)
goto havespan
}
Expand All @@ -61,11 +61,11 @@ retry:
if s.sweepgen == sg-2 && atomic.Cas(&s.sweepgen, sg-2, sg-1) {
// we have an empty span that requires sweeping,
// 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
mSpanList_InsertBack(&c.empty, s)
c.empty.insertBack(s)
unlock(&c.lock)
mSpan_Sweep(s, true)
s.sweep(true)
if s.freelist.ptr() != nil {
goto havespan
}
Expand All @@ -85,12 +85,12 @@ retry:
unlock(&c.lock)

// Replenish central list if empty.
s = mCentral_Grow(c)
s = c.grow()
if s == nil {
return nil
}
lock(&c.lock)
mSpanList_InsertBack(&c.empty, s)
c.empty.insertBack(s)
unlock(&c.lock)

// At this point s is a non-empty span, queued at the end of the empty list,
Expand All @@ -113,7 +113,7 @@ havespan:
}

// Return span from an MCache.
func mCentral_UncacheSpan(c *mcentral, s *mspan) {
func (c *mcentral) uncacheSpan(s *mspan) {
lock(&c.lock)

s.incache = false
Expand All @@ -125,8 +125,8 @@ func mCentral_UncacheSpan(c *mcentral, s *mspan) {
cap := int32((s.npages << _PageShift) / s.elemsize)
n := cap - int32(s.ref)
if n > 0 {
mSpanList_Remove(&c.empty, s)
mSpanList_Insert(&c.nonempty, s)
c.empty.remove(s)
c.nonempty.insert(s)
}
unlock(&c.lock)
}
Expand All @@ -137,7 +137,7 @@ func mCentral_UncacheSpan(c *mcentral, s *mspan) {
// the latest generation.
// If preserve=true, don't return the span to heap nor relink in MCentral lists;
// 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 {
throw("freespan into cached span")
}
Expand All @@ -151,7 +151,7 @@ func mCentral_FreeSpan(c *mcentral, s *mspan, n int32, start gclinkptr, end gcli
if preserve {
// preserve is set only when called from MCentral_CacheSpan above,
// the span must be in the empty list.
if !mSpan_InList(s) {
if !s.inList() {
throw("can't preserve unlinked span")
}
atomic.Store(&s.sweepgen, mheap_.sweepgen)
Expand All @@ -162,8 +162,8 @@ func mCentral_FreeSpan(c *mcentral, s *mspan, n int32, start gclinkptr, end gcli

// Move to nonempty if necessary.
if wasempty {
mSpanList_Remove(&c.empty, s)
mSpanList_Insert(&c.nonempty, s)
c.empty.remove(s)
c.nonempty.insert(s)
}

// delay updating sweepgen until here. This is the signal that
Expand All @@ -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.
mSpanList_Remove(&c.nonempty, s)
c.nonempty.remove(s)
s.needzero = 1
s.freelist = 0
unlock(&c.lock)
heapBitsForSpan(s.base()).initSpan(s.layout())
mHeap_Free(&mheap_, s, 0)
mheap_.freeSpan(s, 0)
return true
}

// 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])
size := uintptr(class_to_size[c.sizeclass])
n := (npages << _PageShift) / size

s := mHeap_Alloc(&mheap_, npages, c.sizeclass, false, true)
s := mheap_.alloc(npages, c.sizeclass, false, true)
if s == nil {
return nil
}
Expand Down
6 changes: 3 additions & 3 deletions src/runtime/mfixalloc.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ type mlink struct {

// Initialize f to allocate objects of the given size,
// 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.first = first
f.arg = arg
Expand All @@ -51,7 +51,7 @@ func fixAlloc_Init(f *fixalloc, size uintptr, first func(arg, p unsafe.Pointer),
f.stat = stat
}

func fixAlloc_Alloc(f *fixalloc) unsafe.Pointer {
func (f *fixalloc) alloc() unsafe.Pointer {
if f.size == 0 {
print("runtime: use of FixAlloc_Alloc before FixAlloc_Init\n")
throw("runtime: internal error")
Expand All @@ -78,7 +78,7 @@ func fixAlloc_Alloc(f *fixalloc) unsafe.Pointer {
return v
}

func fixAlloc_Free(f *fixalloc, p unsafe.Pointer) {
func (f *fixalloc) free(p unsafe.Pointer) {
f.inuse -= f.size
v := (*mlink)(p)
v.next = f.list
Expand Down
Loading

0 comments on commit c17c42e

Please sign in to comment.