From 558919b45474bcdf191e9c9d8865699b036bc054 Mon Sep 17 00:00:00 2001 From: qmuntal Date: Fri, 19 Jan 2024 10:59:39 +0100 Subject: [PATCH] runtime: avoid loading winmm.dll on newer Windows versions winmm.dll is only used for timeBeginPeriod and timeEndPeriod, which are not needed on Windows versions supporting high resolution timers, that is Windows 10 version 1803, and later. Updates #56745. Change-Id: Ie9576638fb8d2b4e648283bec3170aefa76f9f82 Reviewed-on: https://go-review.googlesource.com/c/go/+/556935 Reviewed-by: Cherry Mui Reviewed-by: Bryan Mills LUCI-TryBot-Result: Go LUCI Reviewed-by: Alex Brainman --- src/runtime/os_windows.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go index 6533b64004..cd0a3c260e 100644 --- a/src/runtime/os_windows.go +++ b/src/runtime/os_windows.go @@ -257,16 +257,6 @@ func loadOptionalSyscalls() { _RtlGetCurrentPeb = windowsFindfunc(n32, []byte("RtlGetCurrentPeb\000")) _RtlGetNtVersionNumbers = windowsFindfunc(n32, []byte("RtlGetNtVersionNumbers\000")) - m32 := windowsLoadSystemLib(winmmdll[:]) - if m32 == 0 { - throw("winmm.dll not found") - } - _timeBeginPeriod = windowsFindfunc(m32, []byte("timeBeginPeriod\000")) - _timeEndPeriod = windowsFindfunc(m32, []byte("timeEndPeriod\000")) - if _timeBeginPeriod == nil || _timeEndPeriod == nil { - throw("timeBegin/EndPeriod not found") - } - ws232 := windowsLoadSystemLib(ws2_32dll[:]) if ws232 == 0 { throw("ws2_32.dll not found") @@ -421,6 +411,21 @@ func initHighResTimer() { if h != 0 { haveHighResTimer = true stdcall1(_CloseHandle, h) + } else { + // Only load winmm.dll if we need it. + // This avoids a dependency on winmm.dll for Go programs + // that run on new Windows versions. + m32 := windowsLoadSystemLib(winmmdll[:]) + if m32 == 0 { + print("runtime: LoadLibraryExW failed; errno=", getlasterror(), "\n") + throw("winmm.dll not found") + } + _timeBeginPeriod = windowsFindfunc(m32, []byte("timeBeginPeriod\000")) + _timeEndPeriod = windowsFindfunc(m32, []byte("timeEndPeriod\000")) + if _timeBeginPeriod == nil || _timeEndPeriod == nil { + print("runtime: GetProcAddress failed; errno=", getlasterror(), "\n") + throw("timeBegin/EndPeriod not found") + } } } -- 2.48.1