runtime: use QPC to implement cputicks() on windows/arm

Tracing uses cputicks() to generate trace event timestamps. cputicks()
is expected to be a high resolution clock source. On Windows/ARM,
call QueryPerformanceCounter() which is the highest resolution clock
source available.

Updates #26148

Change-Id: I987fa556060b3d60c02f07b87b9e6320b9b026e2
Reviewed-on: https://go-review.googlesource.com/c/154762
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Jordan Rhee 2018-12-18 16:41:57 -08:00 committed by Brad Fitzpatrick
parent d0f8a7517a
commit 84066f1b0b
2 changed files with 12 additions and 1 deletions

View File

@ -198,6 +198,13 @@ func loadOptionalSyscalls() {
}
_NtWaitForSingleObject = windowsFindfunc(n32, []byte("NtWaitForSingleObject\000"))
if GOARCH == "arm" {
_QueryPerformanceCounter = windowsFindfunc(k32, []byte("QueryPerformanceCounter\000"))
if _QueryPerformanceCounter == nil {
throw("could not find QPC syscalls")
}
}
if windowsFindfunc(n32, []byte("wine_get_version\000")) != nil {
// running on Wine
initWine(k32)

View File

@ -4,9 +4,13 @@
package runtime
import "unsafe"
//go:nosplit
func cputicks() int64 {
return nanotime()
var counter int64
stdcall1(_QueryPerformanceCounter, uintptr(unsafe.Pointer(&counter)))
return counter
}
func checkgoarm() {