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:
parent
4085a4893c
commit
9368ced755
48
src/cmd/go/testdata/script/ws2_32.txt
vendored
Normal file
48
src/cmd/go/testdata/script/ws2_32.txt
vendored
Normal 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()
|
||||
}
|
@ -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 {
|
||||
|
@ -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) {
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user