mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: reorganize memory code
Move code from malloc1.go, malloc2.go, mem.go, mgc0.go into appropriate locations. Factor mgc.go into mgc.go, mgcmark.go, mgcsweep.go, mstats.go. A lot of this code was in certain files because the right place was in a C file but it was written in Go, or vice versa. This is one step toward making things actually well-organized again. Change-Id: I6741deb88a7cfb1c17ffe0bcca3989e10207968f Reviewed-on: https://go-review.googlesource.com/5300 Reviewed-by: Austin Clements <austin@google.com> Reviewed-by: Rick Hudson <rlh@golang.org>
This commit is contained in:
parent
d384545a45
commit
484f801ff4
20 changed files with 2567 additions and 2593 deletions
|
|
@ -2,14 +2,63 @@
|
|||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Per-P malloc cache for small objects.
|
||||
//
|
||||
// See malloc.h for an overview.
|
||||
|
||||
package runtime
|
||||
|
||||
import "unsafe"
|
||||
|
||||
// Per-thread (in Go, per-P) cache for small objects.
|
||||
// No locking needed because it is per-thread (per-P).
|
||||
type mcache struct {
|
||||
// The following members are accessed on every malloc,
|
||||
// so they are grouped here for better caching.
|
||||
next_sample int32 // trigger heap sample after allocating this many bytes
|
||||
local_cachealloc intptr // bytes allocated (or freed) from cache since last lock of heap
|
||||
// Allocator cache for tiny objects w/o pointers.
|
||||
// See "Tiny allocator" comment in malloc.go.
|
||||
tiny unsafe.Pointer
|
||||
tinyoffset uintptr
|
||||
local_tinyallocs uintptr // number of tiny allocs not counted in other stats
|
||||
|
||||
// The rest is not accessed on every malloc.
|
||||
alloc [_NumSizeClasses]*mspan // spans to allocate from
|
||||
|
||||
stackcache [_NumStackOrders]stackfreelist
|
||||
|
||||
sudogcache *sudog
|
||||
|
||||
// Local allocator stats, flushed during GC.
|
||||
local_nlookup uintptr // number of pointer lookups
|
||||
local_largefree uintptr // bytes freed for large objects (>maxsmallsize)
|
||||
local_nlargefree uintptr // number of frees for large objects (>maxsmallsize)
|
||||
local_nsmallfree [_NumSizeClasses]uintptr // number of frees for small objects (<=maxsmallsize)
|
||||
}
|
||||
|
||||
// A gclink is a node in a linked list of blocks, like mlink,
|
||||
// but it is opaque to the garbage collector.
|
||||
// The GC does not trace the pointers during collection,
|
||||
// and the compiler does not emit write barriers for assignments
|
||||
// of gclinkptr values. Code should store references to gclinks
|
||||
// as gclinkptr, not as *gclink.
|
||||
type gclink struct {
|
||||
next gclinkptr
|
||||
}
|
||||
|
||||
// A gclinkptr is a pointer to a gclink, but it is opaque
|
||||
// to the garbage collector.
|
||||
type gclinkptr uintptr
|
||||
|
||||
// ptr returns the *gclink form of p.
|
||||
// The result should be used for accessing fields, not stored
|
||||
// in other data structures.
|
||||
func (p gclinkptr) ptr() *gclink {
|
||||
return (*gclink)(unsafe.Pointer(p))
|
||||
}
|
||||
|
||||
type stackfreelist struct {
|
||||
list gclinkptr // linked list of free stacks
|
||||
size uintptr // total size of stacks in list
|
||||
}
|
||||
|
||||
// dummy MSpan that contains no free objects.
|
||||
var emptymspan mspan
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue