diff options
Diffstat (limited to 'src/runtime/mcentral.go')
-rw-r--r-- | src/runtime/mcentral.go | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/src/runtime/mcentral.go b/src/runtime/mcentral.go index 0d172a08b..ae5c6f1d5 100644 --- a/src/runtime/mcentral.go +++ b/src/runtime/mcentral.go @@ -55,7 +55,7 @@ retry: mSpanList_InsertBack(&c.empty, s) unlock(&c.lock) mSpan_Sweep(s, true) - if s.freelist != nil { + if s.freelist.ptr() != nil { goto havespan } lock(&c.lock) @@ -90,7 +90,7 @@ havespan: if n == 0 { gothrow("empty span") } - if s.freelist == nil { + if s.freelist.ptr() == nil { gothrow("freelist empty") } s.incache = true @@ -122,14 +122,14 @@ 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 *mlink, end *mlink, preserve bool) bool { +func mCentral_FreeSpan(c *mcentral, s *mspan, n int32, start gclinkptr, end gclinkptr, preserve bool) bool { if s.incache { gothrow("freespan into cached span") } // Add the objects back to s's free list. - wasempty := s.freelist == nil - end.next = s.freelist + wasempty := s.freelist.ptr() == nil + end.ptr().next = s.freelist s.freelist = start s.ref -= uint16(n) @@ -165,7 +165,7 @@ func mCentral_FreeSpan(c *mcentral, s *mspan, n int32, start *mlink, end *mlink, // s is completely freed, return it to the heap. mSpanList_Remove(s) s.needzero = 1 - s.freelist = nil + s.freelist = 0 unlock(&c.lock) unmarkspan(uintptr(s.start)<<_PageShift, s.npages<<_PageShift) mHeap_Free(&mheap_, s, 0) @@ -183,17 +183,21 @@ func mCentral_Grow(c *mcentral) *mspan { return nil } - // Carve span into sequence of blocks. - tailp := &s.freelist p := uintptr(s.start << _PageShift) s.limit = p + size*n - for i := uintptr(0); i < n; i++ { - v := (*mlink)(unsafe.Pointer(p)) - *tailp = v - tailp = &v.next + head := gclinkptr(p) + tail := gclinkptr(p) + // i==0 iteration already done + for i := uintptr(1); i < n; i++ { p += size + tail.ptr().next = gclinkptr(p) + tail = gclinkptr(p) } - *tailp = nil + if s.freelist.ptr() != nil { + gothrow("freelist not empty") + } + tail.ptr().next = 0 + s.freelist = head markspan(unsafe.Pointer(uintptr(s.start)<<_PageShift), size, n, size*n < s.npages<<_PageShift) return s } |