Home | History | Annotate | Download | only in test
      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 // +build !android
      6 
      7 // Test that pthread_cancel works as expected
      8 // (NPTL uses SIGRTMIN to implement thread cancelation)
      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 "testing"
     21 import "time"
     22 
     23 func test6997(t *testing.T) {
     24 	r := C.StartThread()
     25 	if r != 0 {
     26 		t.Error("pthread_create failed")
     27 	}
     28 	c := make(chan C.int)
     29 	go func() {
     30 		time.Sleep(500 * time.Millisecond)
     31 		c <- C.CancelThread()
     32 	}()
     33 
     34 	select {
     35 	case r = <-c:
     36 		if r == 0 {
     37 			t.Error("pthread finished but wasn't canceled??")
     38 		}
     39 	case <-time.After(30 * time.Second):
     40 		t.Error("hung in pthread_cancel/pthread_join")
     41 	}
     42 }
     43