Source file src/cmd/cgo/internal/testsanitizers/testdata/tsan15.go

     1  // Copyright 2024 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  package main
     6  
     7  // Test case for issue 66427.
     8  // Running under TSAN, this fails with "signal handler
     9  // spoils errno".
    10  
    11  /*
    12  #include <pthread.h>
    13  #include <signal.h>
    14  #include <stdlib.h>
    15  
    16  void go_callback();
    17  
    18  static void *thr(void *arg) {
    19  	int i;
    20  	for (i = 0; i < 10; i++)
    21  		go_callback();
    22  	return 0;
    23  }
    24  
    25  static void *sendthr(void *arg) {
    26  	pthread_t th = *(pthread_t*)arg;
    27  	while (1) {
    28  		int r = pthread_kill(th, SIGWINCH);
    29  		if (r < 0)
    30  			break;
    31  	}
    32  	return 0;
    33  }
    34  
    35  static void foo() {
    36  	pthread_t *th = malloc(sizeof(pthread_t));
    37  	pthread_t th2;
    38  	pthread_create(th, 0, thr, 0);
    39  	pthread_create(&th2, 0, sendthr, th);
    40  	pthread_join(*th, 0);
    41  }
    42  */
    43  import "C"
    44  
    45  import (
    46  	"time"
    47  )
    48  
    49  //export go_callback
    50  func go_callback() {}
    51  
    52  func main() {
    53  	go func() {
    54  		for {
    55  			C.foo()
    56  		}
    57  	}()
    58  
    59  	time.Sleep(1000 * time.Millisecond)
    60  }
    61  

View as plain text