// Copyright 2017 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. // We skip this test in race mode because, for unknown reasons, // linking against CoreFoundation on macOS 10.10 causes mmap to ignore // the hint address, which makes the Go allocator incompatible with // TSAN. See golang.org/issue/26475. // // TODO(austin): Once support for macOS 10.10 is dropped, remove the // race constraint (and the one in issue21897b.go). See // golang.org/issue/26513. // +build darwin,cgo,!internal,!race package cgotest /* #cgo LDFLAGS: -framework CoreFoundation #include <CoreFoundation/CoreFoundation.h> */ import "C" import ( "runtime/debug" "testing" "unsafe" ) func test21897(t *testing.T) { // Please write barrier, kick in soon. defer debug.SetGCPercent(debug.SetGCPercent(1)) for i := 0; i < 10000; i++ { testCFNumberRef() testCFDateRef() testCFBooleanRef() // Allocate some memory, so eventually the write barrier is enabled // and it will see writes of bad pointers in the test* functions below. byteSliceSink = make([]byte, 1024) } } var byteSliceSink []byte func testCFNumberRef() { var v int64 = 0 xCFNumberRef = C.CFNumberCreate(C.kCFAllocatorSystemDefault, C.kCFNumberSInt64Type, unsafe.Pointer(&v)) //fmt.Printf("CFNumberRef: %x\n", uintptr(unsafe.Pointer(xCFNumberRef))) } var xCFNumberRef C.CFNumberRef func testCFDateRef() { xCFDateRef = C.CFDateCreate(C.kCFAllocatorSystemDefault, 0) // 0 value is 1 Jan 2001 00:00:00 GMT //fmt.Printf("CFDateRef: %x\n", uintptr(unsafe.Pointer(xCFDateRef))) } var xCFDateRef C.CFDateRef func testCFBooleanRef() { xCFBooleanRef = C.kCFBooleanFalse //fmt.Printf("CFBooleanRef: %x\n", uintptr(unsafe.Pointer(xCFBooleanRef))) } var xCFBooleanRef C.CFBooleanRef