github.com/tcnksm/go@v0.0.0-20141208075154-439b32936367/src/runtime/mgc1.go (about)

     1  // Copyright 2012 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Garbage collector (GC)
     6  
     7  package runtime
     8  
     9  const (
    10  	// Four bits per word (see #defines below).
    11  	gcBits             = 4
    12  	wordsPerBitmapByte = 8 / gcBits
    13  )
    14  
    15  const (
    16  	// GC type info programs.
    17  	// The programs allow to store type info required for GC in a compact form.
    18  	// Most importantly arrays take O(1) space instead of O(n).
    19  	// The program grammar is:
    20  	//
    21  	// Program = {Block} "insEnd"
    22  	// Block = Data | Array
    23  	// Data = "insData" DataSize DataBlock
    24  	// DataSize = int // size of the DataBlock in bit pairs, 1 byte
    25  	// DataBlock = binary // dense GC mask (2 bits per word) of size ]DataSize/4[ bytes
    26  	// Array = "insArray" ArrayLen Block "insArrayEnd"
    27  	// ArrayLen = int // length of the array, 8 bytes (4 bytes for 32-bit arch)
    28  	//
    29  	// Each instruction (insData, insArray, etc) is 1 byte.
    30  	// For example, for type struct { x []byte; y [20]struct{ z int; w *byte }; }
    31  	// the program looks as:
    32  	//
    33  	// insData 3 (BitsPointer BitsScalar BitsScalar)
    34  	//	insArray 20 insData 2 (BitsScalar BitsPointer) insArrayEnd insEnd
    35  	//
    36  	// Total size of the program is 17 bytes (13 bytes on 32-bits).
    37  	// The corresponding GC mask would take 43 bytes (it would be repeated
    38  	// because the type has odd number of words).
    39  	insData = 1 + iota
    40  	insArray
    41  	insArrayEnd
    42  	insEnd
    43  )
    44  
    45  const (
    46  	// Pointer map
    47  	_BitsPerPointer  = 2
    48  	_BitsMask        = (1 << _BitsPerPointer) - 1
    49  	_PointersPerByte = 8 / _BitsPerPointer
    50  
    51  	// If you change these, also change scanblock.
    52  	// scanblock does "if(bits == BitsScalar || bits == BitsDead)" as "if(bits <= BitsScalar)".
    53  	_BitsDead          = 0
    54  	_BitsScalar        = 1                                // 01
    55  	_BitsPointer       = 2                                // 10
    56  	_BitsCheckMarkXor  = 1                                // 10
    57  	_BitsScalarMarked  = _BitsScalar ^ _BitsCheckMarkXor  // 00
    58  	_BitsPointerMarked = _BitsPointer ^ _BitsCheckMarkXor // 11
    59  
    60  	// 64 bytes cover objects of size 1024/512 on 64/32 bits, respectively.
    61  	_MaxGCMask = 65536 // TODO(rsc): change back to 64
    62  )
    63  
    64  // Bits in per-word bitmap.
    65  // #defines because we shift the values beyond 32 bits.
    66  //
    67  // Each word in the bitmap describes wordsPerBitmapWord words
    68  // of heap memory.  There are 4 bitmap bits dedicated to each heap word,
    69  // so on a 64-bit system there is one bitmap word per 16 heap words.
    70  //
    71  // The bitmap starts at mheap.arena_start and extends *backward* from
    72  // there.  On a 64-bit system the off'th word in the arena is tracked by
    73  // the off/16+1'th word before mheap.arena_start.  (On a 32-bit system,
    74  // the only difference is that the divisor is 8.)
    75  const (
    76  	bitBoundary = 1 // boundary of an object
    77  	bitMarked   = 2 // marked object
    78  	bitMask     = bitBoundary | bitMarked
    79  	bitPtrMask  = _BitsMask << 2
    80  )