From: Mikio Hara Date: Fri, 19 Feb 2016 08:34:54 +0000 (+0900) Subject: net/internal/socktest: add missing support for AcceptEx X-Git-Tag: go1.7beta1~1807 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=64d2a88105d503d1a0275388823b8112a870d13b;p=gostls13.git net/internal/socktest: add missing support for AcceptEx Change-Id: I37faedc6fa316fffac80093b01e15429995b0f5b Reviewed-on: https://go-review.googlesource.com/19705 Reviewed-by: Ian Lance Taylor --- diff --git a/src/net/internal/socktest/switch.go b/src/net/internal/socktest/switch.go index 8bef06b97c..3c37b6ff80 100644 --- a/src/net/internal/socktest/switch.go +++ b/src/net/internal/socktest/switch.go @@ -121,7 +121,7 @@ const ( FilterSocket FilterType = iota // for Socket FilterConnect // for Connect or ConnectEx FilterListen // for Listen - FilterAccept // for Accept or Accept4 + FilterAccept // for Accept, Accept4 or AcceptEx FilterGetsockoptInt // for GetsockoptInt FilterClose // for Close or Closesocket ) diff --git a/src/net/internal/socktest/sys_windows.go b/src/net/internal/socktest/sys_windows.go index e61bf2be60..2e3d2bc7fc 100644 --- a/src/net/internal/socktest/sys_windows.go +++ b/src/net/internal/socktest/sys_windows.go @@ -154,3 +154,33 @@ func (sw *Switch) Listen(s syscall.Handle, backlog int) (err error) { sw.stats.getLocked(so.Cookie).Listened++ return nil } + +// AcceptEx wraps syscall.AcceptEx. +func (sw *Switch) AcceptEx(ls syscall.Handle, as syscall.Handle, b *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, rcvd *uint32, overlapped *syscall.Overlapped) error { + so := sw.sockso(ls) + if so == nil { + return syscall.AcceptEx(ls, as, b, rxdatalen, laddrlen, raddrlen, rcvd, overlapped) + } + sw.fmu.RLock() + f, _ := sw.fltab[FilterAccept] + sw.fmu.RUnlock() + + af, err := f.apply(so) + if err != nil { + return err + } + so.Err = syscall.AcceptEx(ls, as, b, rxdatalen, laddrlen, raddrlen, rcvd, overlapped) + if err = af.apply(so); err != nil { + return err + } + + sw.smu.Lock() + defer sw.smu.Unlock() + if so.Err != nil { + sw.stats.getLocked(so.Cookie).AcceptFailed++ + return so.Err + } + nso := sw.addLocked(as, so.Cookie.Family(), so.Cookie.Type(), so.Cookie.Protocol()) + sw.stats.getLocked(nso.Cookie).Accepted++ + return nil +}