]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use QPC to implement cputicks() on windows/arm
authorJordan Rhee <jordanrh@microsoft.com>
Wed, 19 Dec 2018 00:41:57 +0000 (16:41 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 20 Dec 2018 00:23:03 +0000 (00:23 +0000)
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>

src/runtime/os_windows.go
src/runtime/os_windows_arm.go

index 9b34589874c54cea836bf0dcfce0c69745dab61a..2e1ec58a0d9be1b4ebf848128ca3b3eb0e3afea6 100644 (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)
index 3115f7241dbeb3904f42df7c15e3bea60d5450f4..10aff75e31191bc5b04051978d9308b28a0f9c77 100644 (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() {