github.com/huandu/go@v0.0.0-20151114150818-04e615e41150/misc/cgo/test/issue6997_linux.go (about)

     1  // Copyright 2014 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  // Test that pthread_cancel works as expected
     6  // (NPTL uses SIGRTMIN to implement thread cancellation)
     7  // See https://golang.org/issue/6997
     8  package cgotest
     9  
    10  /*
    11  #cgo CFLAGS: -pthread
    12  #cgo LDFLAGS: -pthread
    13  extern int StartThread();
    14  extern int CancelThread();
    15  */
    16  import "C"
    17  
    18  import "testing"
    19  import "time"
    20  
    21  func test6997(t *testing.T) {
    22  	r := C.StartThread()
    23  	if r != 0 {
    24  		t.Error("pthread_create failed")
    25  	}
    26  	c := make(chan C.int)
    27  	go func() {
    28  		time.Sleep(500 * time.Millisecond)
    29  		c <- C.CancelThread()
    30  	}()
    31  
    32  	select {
    33  	case r = <-c:
    34  		if r == 0 {
    35  			t.Error("pthread finished but wasn't cancelled??")
    36  		}
    37  	case <-time.After(30 * time.Second):
    38  		t.Error("hung in pthread_cancel/pthread_join")
    39  	}
    40  }