go stackobj2 源码

  • 2022-07-15
  • 浏览 (877)

golang stackobj2 代码

文件路径:/test/stackobj2.go

// run

// Copyright 2018 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 main

import (
	"fmt"
	"runtime"
)

// linked list up the stack, to test lots of stack objects.

type T struct {
	// points to a heap object. Test will make sure it isn't freed.
	data *int64
	// next pointer for a linked list of stack objects
	next *T
	// duplicate of next, to stress test the pointer buffers
	// used during stack tracing.
	next2 *T
}

func main() {
	makelist(nil, 10000)
}

func makelist(x *T, n int64) {
	if n%2 != 0 {
		panic("must be multiple of 2")
	}
	if n == 0 {
		runtime.GC()
		i := int64(1)
		for ; x != nil; x, i = x.next, i+1 {
			// Make sure x.data hasn't been collected.
			if got := *x.data; got != i {
				panic(fmt.Sprintf("bad data want %d, got %d", i, got))
			}
		}
		return
	}
	// Put 2 objects in each frame, to test intra-frame pointers.
	// Use both orderings to ensure the linked list isn't always in address order.
	var a, b T
	if n%3 == 0 {
		a.data = newInt(n)
		a.next = x
		a.next2 = x
		b.data = newInt(n - 1)
		b.next = &a
		b.next2 = &a
		x = &b
	} else {
		b.data = newInt(n)
		b.next = x
		b.next2 = x
		a.data = newInt(n - 1)
		a.next = &b
		a.next2 = &b
		x = &a
	}

	makelist(x, n-2)
}

// big enough and pointer-y enough to not be tinyalloc'd
type NotTiny struct {
	n int64
	p *byte
}

// newInt allocates n on the heap and returns a pointer to it.
func newInt(n int64) *int64 {
	h := &NotTiny{n: n}
	p := &h.n
	escape = p
	return p
}

var escape *int64

相关信息

go 源码目录

相关文章

go 235 源码

go 64bit 源码

go alg 源码

go alias 源码

go alias1 源码

go alias2 源码

go alias3 源码

go align 源码

go append 源码

go append1 源码

0  赞