mirror of
https://github.com/golang/go
synced 2024-11-20 04:24:51 -07:00
75d779566b
Some routines run without and m or g and cannot invoke the race detector runtime. They must be opaque to the runtime. That used to be true because they were written in C. Now that they are written in Go, disable the race detector annotations for those functions explicitly. Add test. Fixes #10874. Change-Id: Ia8cc28d51e7051528f9f9594b75634e6bb66a785 Reviewed-on: https://go-review.googlesource.com/12534 Reviewed-by: Ian Lance Taylor <iant@golang.org>
97 lines
3.3 KiB
Go
97 lines
3.3 KiB
Go
// Copyright 2011 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.
|
|
|
|
package cgo
|
|
|
|
import "unsafe"
|
|
|
|
// These utility functions are available to be called from code
|
|
// compiled with gcc via crosscall2.
|
|
|
|
// cgocallback is defined in runtime
|
|
//go:linkname _runtime_cgocallback runtime.cgocallback
|
|
func _runtime_cgocallback(unsafe.Pointer, unsafe.Pointer, uintptr)
|
|
|
|
// The declaration of crosscall2 is:
|
|
// void crosscall2(void (*fn)(void *, int), void *, int);
|
|
//
|
|
// We need to export the symbol crosscall2 in order to support
|
|
// callbacks from shared libraries. This applies regardless of
|
|
// linking mode.
|
|
//go:cgo_export_static crosscall2
|
|
//go:cgo_export_dynamic crosscall2
|
|
|
|
// Panic. The argument is converted into a Go string.
|
|
|
|
// Call like this in code compiled with gcc:
|
|
// struct { const char *p; } a;
|
|
// a.p = /* string to pass to panic */;
|
|
// crosscall2(_cgo_panic, &a, sizeof a);
|
|
// /* The function call will not return. */
|
|
|
|
//go:linkname _runtime_cgo_panic_internal runtime._cgo_panic_internal
|
|
var _runtime_cgo_panic_internal byte
|
|
|
|
//go:linkname _cgo_panic _cgo_panic
|
|
//go:cgo_export_static _cgo_panic
|
|
//go:cgo_export_dynamic _cgo_panic
|
|
//go:nosplit
|
|
//go:norace
|
|
func _cgo_panic(a unsafe.Pointer, n int32) {
|
|
_runtime_cgocallback(unsafe.Pointer(&_runtime_cgo_panic_internal), a, uintptr(n))
|
|
}
|
|
|
|
//go:cgo_import_static x_cgo_init
|
|
//go:linkname x_cgo_init x_cgo_init
|
|
//go:linkname _cgo_init _cgo_init
|
|
var x_cgo_init byte
|
|
var _cgo_init = &x_cgo_init
|
|
|
|
//go:cgo_import_static x_cgo_malloc
|
|
//go:linkname x_cgo_malloc x_cgo_malloc
|
|
//go:linkname _cgo_malloc _cgo_malloc
|
|
var x_cgo_malloc byte
|
|
var _cgo_malloc = &x_cgo_malloc
|
|
|
|
//go:cgo_import_static x_cgo_free
|
|
//go:linkname x_cgo_free x_cgo_free
|
|
//go:linkname _cgo_free _cgo_free
|
|
var x_cgo_free byte
|
|
var _cgo_free = &x_cgo_free
|
|
|
|
//go:cgo_import_static x_cgo_thread_start
|
|
//go:linkname x_cgo_thread_start x_cgo_thread_start
|
|
//go:linkname _cgo_thread_start _cgo_thread_start
|
|
var x_cgo_thread_start byte
|
|
var _cgo_thread_start = &x_cgo_thread_start
|
|
|
|
// Creates a new system thread without updating any Go state.
|
|
//
|
|
// This method is invoked during shared library loading to create a new OS
|
|
// thread to perform the runtime initialization. This method is similar to
|
|
// _cgo_sys_thread_start except that it doesn't update any Go state.
|
|
|
|
//go:cgo_import_static x_cgo_sys_thread_create
|
|
//go:linkname x_cgo_sys_thread_create x_cgo_sys_thread_create
|
|
//go:linkname _cgo_sys_thread_create _cgo_sys_thread_create
|
|
var x_cgo_sys_thread_create byte
|
|
var _cgo_sys_thread_create = &x_cgo_sys_thread_create
|
|
|
|
// Notifies that the runtime has been intialized.
|
|
//
|
|
// We currently block at every CGO entry point (via _cgo_wait_runtime_init_done)
|
|
// to ensure that the runtime has been initialized before the CGO call is
|
|
// executed. This is necessary for shared libraries where we kickoff runtime
|
|
// initialization in a separate thread and return without waiting for this
|
|
// thread to complete the init.
|
|
|
|
//go:cgo_import_static x_cgo_notify_runtime_init_done
|
|
//go:linkname x_cgo_notify_runtime_init_done x_cgo_notify_runtime_init_done
|
|
//go:linkname _cgo_notify_runtime_init_done _cgo_notify_runtime_init_done
|
|
var x_cgo_notify_runtime_init_done byte
|
|
var _cgo_notify_runtime_init_done = &x_cgo_notify_runtime_init_done
|
|
|
|
//go:cgo_export_static _cgo_topofstack
|
|
//go:cgo_export_dynamic _cgo_topofstack
|