github.com/scaleft/monotime@v0.0.0-20180209174256-2da272f3dad0/clock_windows_qpf.go (about)

     1  // +build windows
     2  // +build !go1.9
     3  
     4  package monotime
     5  
     6  import (
     7  	"time"
     8  	"unsafe"
     9  
    10  	"golang.org/x/sys/windows"
    11  )
    12  
    13  var (
    14  	modKernel32 = windows.NewLazySystemDLL("kernel32.dll")
    15  )
    16  
    17  var (
    18  	procQueryPerformanceCounter   = modKernel32.NewProc("QueryPerformanceCounter")
    19  	procQueryPerformanceFrequency = modKernel32.NewProc("QueryPerformanceFrequency")
    20  )
    21  
    22  var counterFreq float64
    23  
    24  func init() {
    25  	var freq int64
    26  	ret, _, err := procQueryPerformanceFrequency.Call(uintptr(unsafe.Pointer(&freq)))
    27  	if ret == 0 {
    28  		panic(err.Error())
    29  	}
    30  
    31  	counterFreq = float64(freq) / 1e9
    32  }
    33  
    34  func monotime() Monotime {
    35  	var t uint64
    36  
    37  	ret, _, err := procQueryPerformanceCounter.Call(uintptr(unsafe.Pointer(&t)))
    38  	if ret == 0 {
    39  		panic(err.Error())
    40  	}
    41  
    42  	return t
    43  }
    44  
    45  func duration(start Monotime, end Monotime) time.Duration {
    46  	return time.Duration(float64((end - start)) / counterFreq)
    47  }