| // Copyright 2010 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. |
| |
| // Go definitions of internal structures. Master is malloc.h |
| |
| package runtime |
| |
| import "unsafe" |
| |
| const ( |
| pageShift = 12 |
| pageSize = 1 << pageShift |
| pageMask = pageSize - 1 |
| ) |
| |
| type pageID uintptr |
| |
| const ( |
| numSizeClasses = 67 |
| maxSmallSize = 32 << 10 |
| fixAllocChunk = 128 << 10 |
| maxMCacheListLen = 256 |
| maxMCacheSize = 2 << 20 |
| maxMHeapList = 1 << 8 // 1 << (20 - pageShift) |
| heapAllocChunk = 1 << 20 |
| ) |
| |
| type mLink struct { |
| next *mLink |
| } |
| |
| type fixAlloc struct { |
| size uintptr |
| alloc func(uintptr) |
| first func(unsafe.Pointer, *byte) |
| arg unsafe.Pointer |
| list *mLink |
| chunk *byte |
| nchunk uint32 |
| inuse uintptr |
| sys uintptr |
| } |
| |
| |
| // MStats? used to be in extern.go |
| |
| type mCacheList struct { |
| list *mLink |
| nlist uint32 |
| nlistmin uint32 |
| } |
| |
| type mCache struct { |
| list [numSizeClasses]mCacheList |
| size uint64 |
| local_alloc int64 |
| local_objects int64 |
| next_sample int32 |
| } |
| |
| type mSpan struct { |
| next *mSpan |
| prev *mSpan |
| allnext *mSpan |
| start pageID |
| npages uintptr |
| freelist *mLink |
| ref uint32 |
| sizeclass uint32 |
| state uint32 |
| // union { |
| gcref *uint32 // sizeclass > 0 |
| // gcref0 uint32; // sizeclass == 0 |
| // } |
| } |
| |
| type mCentral struct { |
| lock |
| sizeclass int32 |
| nonempty mSpan |
| empty mSpan |
| nfree int32 |
| } |
| |
| type mHeap struct { |
| lock |
| free [maxMHeapList]mSpan |
| large mSpan |
| allspans *mSpan |
| map_ mHeapMap |
| min *byte |
| max *byte |
| closure_min *byte |
| closure_max *byte |
| |
| central [numSizeClasses]struct { |
| pad [64]byte |
| // union: mCentral |
| } |
| |
| spanalloc fixAlloc |
| cachealloc fixAlloc |
| } |
| |
| const ( |
| refFree = iota |
| refStack |
| refNone |
| refSome |
| refcountOverhead = 4 |
| refNoPointers = 0x80000000 |
| refHasFinalizer = 0x40000000 |
| refProfiled = 0x20000000 |
| refNoProfiling = 0x10000000 |
| refFlags = 0xFFFF0000 |
| ) |
| |
| const ( |
| mProf_None = iota |
| mProf_Sample |
| mProf_All |
| ) |
| |
| type finalizer struct { |
| next *finalizer |
| fn func(unsafe.Pointer) |
| arg unsafe.Pointer |
| nret int32 |
| } |