| // build -gcflags=-l=4 | |
| // Copyright 2023 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 p | |
| type Interface interface { | |
| MonitoredResource() (resType string, labels map[string]string) | |
| Done() | |
| } | |
| func Autodetect() Interface { | |
| return func() Interface { | |
| Do(func() { | |
| var ad, gd Interface | |
| go func() { | |
| defer gd.Done() | |
| ad = aad() | |
| }() | |
| go func() { | |
| defer ad.Done() | |
| gd = aad() | |
| defer func() { recover() }() | |
| }() | |
| autoDetected = ad | |
| if gd != nil { | |
| autoDetected = gd | |
| } | |
| }) | |
| return autoDetected | |
| }() | |
| } | |
| var autoDetected Interface | |
| var G int | |
| type If int | |
| func (x If) MonitoredResource() (resType string, labels map[string]string) { | |
| return "", nil | |
| } | |
| //go:noinline | |
| func (x If) Done() { | |
| G++ | |
| } | |
| //go:noinline | |
| func Do(fn func()) { | |
| fn() | |
| } | |
| //go:noinline | |
| func aad() Interface { | |
| var x If | |
| return x | |
| } |