1
0
mirror of https://github.com/golang/go synced 2024-09-29 17:14:29 -06:00

net,internal/poll: load ws2_32.dll only when net is imported

On Windows, ws2_32.dll is loaded and WSA initialized even if websockets
are not used.

This CL delays loading of ws2_32.dll and starting WSA until net is
initialized.

Change-Id: I07ea8241d79709cd4e80d29ba0d792c7444bbfe9
Reviewed-on: https://go-review.googlesource.com/c/go/+/557015
Reviewed-by: Bryan Mills <bcmills@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
qmuntal 2024-01-19 16:27:22 +01:00 committed by Quim Muntal
parent 4085a4893c
commit 9368ced755
4 changed files with 59 additions and 2 deletions

48
src/cmd/go/testdata/script/ws2_32.txt vendored Normal file
View File

@ -0,0 +1,48 @@
[!GOOS:windows] skip
go run .
stdout 'ws2_32.dll: not found'
go run -tags net .
stdout 'ws2_32.dll: found'
-- go.mod --
module m
go 1.21
-- utils.go --
package main
import (
"fmt"
"syscall"
"unsafe"
)
func hasModuleHandle() {
const ws2_32 = "ws2_32.dll"
getModuleHandle := syscall.MustLoadDLL("kernel32.dll").MustFindProc("GetModuleHandleW")
mod, _, _ := getModuleHandle.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(ws2_32))))
if mod != 0 {
fmt.Println(ws2_32+":", "found")
} else {
fmt.Println(ws2_32+":", "not found")
}
}
-- net.go --
//go:build net
package main
import _ "net"
func main() {
hasModuleHandle()
}
-- nonet.go --
//go:build !net
package main
func main() {
hasModuleHandle()
}

View File

@ -53,14 +53,17 @@ func checkSetFileCompletionNotificationModes() {
useSetFileCompletionNotificationModes = true
}
func init() {
// InitWSA initiates the use of the Winsock DLL by the current process.
// It is called from the net package at init time to avoid
// loading ws2_32.dll when net is not used.
var InitWSA = sync.OnceFunc(func() {
var d syscall.WSAData
e := syscall.WSAStartup(uint32(0x202), &d)
if e != nil {
initErr = e
}
checkSetFileCompletionNotificationModes()
}
})
// operation contains superset of data necessary to perform all async IO.
type operation struct {

View File

@ -41,6 +41,8 @@ func logFD(net string, fd *poll.FD, err error) {
func init() {
loggedFDs = make(map[syscall.Handle]*loggedFD)
*poll.LogInitFD = logFD
poll.InitWSA()
}
func findLoggedFD(h syscall.Handle) (lfd *loggedFD, found bool) {

View File

@ -23,6 +23,10 @@ const (
writeMsgSyscallName = "wsasendmsg"
)
func init() {
poll.InitWSA()
}
// canUseConnectEx reports whether we can use the ConnectEx Windows API call
// for the given network type.
func canUseConnectEx(net string) bool {