...
Run Format

Source file src/runtime/testdata/testprogcgo/dropm.go

Documentation: runtime/testdata/testprogcgo

  // Copyright 2016 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.
  
  // +build !plan9,!windows
  
  // Test that a sequence of callbacks from C to Go get the same m.
  // This failed to be true on arm and arm64, which was the root cause
  // of issue 13881.
  
  package main
  
  /*
  #include <stddef.h>
  #include <pthread.h>
  
  extern void GoCheckM();
  
  static void* thread(void* arg __attribute__ ((unused))) {
  	GoCheckM();
  	return NULL;
  }
  
  static void CheckM() {
  	pthread_t tid;
  	pthread_create(&tid, NULL, thread, NULL);
  	pthread_join(tid, NULL);
  	pthread_create(&tid, NULL, thread, NULL);
  	pthread_join(tid, NULL);
  }
  */
  import "C"
  
  import (
  	"fmt"
  	"os"
  )
  
  func init() {
  	register("EnsureDropM", EnsureDropM)
  }
  
  var savedM uintptr
  
  //export GoCheckM
  func GoCheckM() {
  	m := runtime_getm_for_test()
  	if savedM == 0 {
  		savedM = m
  	} else if savedM != m {
  		fmt.Printf("m == %x want %x\n", m, savedM)
  		os.Exit(1)
  	}
  }
  
  func EnsureDropM() {
  	C.CheckM()
  	fmt.Println("OK")
  }
  

View as plain text