...
Run Format

Source file test/mallocfin.go

Documentation: test

  // run
  
  // 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.
  
  // Test basic operation of finalizers.
  
  package main
  
  import (
  	"runtime"
  	"time"
  )
  
  const N = 250
  
  type A struct {
  	b *B
  	n int
  }
  
  type B struct {
  	n int
  }
  
  var i int
  var nfinal int
  var final [N]int
  
  // the unused return is to test finalizers with return values
  func finalA(a *A) (unused [N]int) {
  	if final[a.n] != 0 {
  		println("finalA", a.n, final[a.n])
  		panic("fail")
  	}
  	final[a.n] = 1
  	return
  }
  
  func finalB(b *B) {
  	if final[b.n] != 1 {
  		println("finalB", b.n, final[b.n])
  		panic("fail")
  	}
  	final[b.n] = 2
  	nfinal++
  }
  
  func nofinalB(b *B) {
  	panic("nofinalB run")
  }
  
  func main() {
  	runtime.GOMAXPROCS(4)
  	for i = 0; i < N; i++ {
  		b := &B{i}
  		a := &A{b, i}
  		c := new(B)
  		runtime.SetFinalizer(c, nofinalB)
  		runtime.SetFinalizer(b, finalB)
  		runtime.SetFinalizer(a, finalA)
  		runtime.SetFinalizer(c, nil)
  	}
  	for i := 0; i < N; i++ {
  		runtime.GC()
  		runtime.Gosched()
  		time.Sleep(1e6)
  		if nfinal >= N*8/10 {
  			break
  		}
  	}
  	if nfinal < N*8/10 {
  		println("not enough finalizing:", nfinal, "/", N)
  		panic("fail")
  	}
  }
  

View as plain text