// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package runtime // This is a temporary mcache.go for gccgo. // At some point it will be replaced by the one in the gc runtime package. import "unsafe" type mcachelist struct { list *mlink nlist uint32 } // Per-thread (in Go, per-P) cache for small objects. // No locking needed because it is per-thread (per-P). // // mcaches are allocated from non-GC'd memory, so any heap pointers // must be specially handled. // //go:notinheap 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 uintptr // 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 points to the beginning of the current tiny block, or // nil if there is no current tiny block. // // tiny is a heap pointer. Since mcache is in non-GC'd memory, // we handle it by clearing it in releaseAll during mark // termination. tiny unsafe.Pointer tinysize uintptr // The rest is not accessed on every malloc. alloc [_NumSizeClasses]*mspan // spans to allocate from free [_NumSizeClasses]mcachelist // lists of explicitly freed objects // 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) } type mtypes struct { compression byte data uintptr } type special struct { next *special offset uint16 kind byte } type mspan struct { next *mspan // next span in list, or nil if none prev *mspan // previous span's next field, or list head's first field if none start uintptr npages uintptr // number of pages in span freelist *mlink // sweep generation: // if sweepgen == h->sweepgen - 2, the span needs sweeping // if sweepgen == h->sweepgen - 1, the span is currently being swept // if sweepgen == h->sweepgen, the span is swept and ready to use // h->sweepgen is incremented by 2 after every GC sweepgen uint32 ref uint16 sizeclass uint8 // size class incache bool // being used by an mcache state uint8 // mspaninuse etc needzero uint8 // needs to be zeroed before allocation elemsize uintptr // computed from sizeclass or from npages unusedsince int64 // first time spotted by gc in mspanfree state npreleased uintptr // number of pages released to the os limit uintptr // end of data in span types mtypes speciallock mutex // guards specials list specials *special // linked list of special records sorted by offset. freebuf *mlink } type mlink struct { next *mlink }