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