]> Cypherpunks repositories - gostls13.git/commitdiff
net/internal/socktest: add missing support for AcceptEx
authorMikio Hara <mikioh.mikioh@gmail.com>
Fri, 19 Feb 2016 08:34:54 +0000 (17:34 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Sun, 21 Feb 2016 03:09:25 +0000 (03:09 +0000)
Change-Id: I37faedc6fa316fffac80093b01e15429995b0f5b
Reviewed-on: https://go-review.googlesource.com/19705
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/net/internal/socktest/switch.go
src/net/internal/socktest/sys_windows.go

index 8bef06b97c873fe08dbf28eaa4554b4295419c7a..3c37b6ff80737aa6e35124e7a19608580267518f 100644 (file)
@@ -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
 )
index e61bf2be605cfe6f866913fe5d7bbd54ca1b2a98..2e3d2bc7fcecb4e98926ff748fd8f2a8b5bf210e 100644 (file)
@@ -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
+}