]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: avoid loading winmm.dll on newer Windows versions
authorqmuntal <quimmuntal@gmail.com>
Fri, 19 Jan 2024 09:59:39 +0000 (10:59 +0100)
committerQuim Muntal <quimmuntal@gmail.com>
Mon, 22 Jan 2024 17:00:04 +0000 (17:00 +0000)
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 <cherryyz@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
src/runtime/os_windows.go

index 6533b6400490d140b9b419d7d0e750e682e9fdfa..cd0a3c260ec7f91303785743db0eeef436251d2b 100644 (file)
@@ -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")
+               }
        }
 }