]> Cypherpunks repositories - gostls13.git/commitdiff
net: have separate read and write processing threads on windows
authorAlex Brainman <alex.brainman@gmail.com>
Tue, 27 Aug 2013 04:53:57 +0000 (14:53 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Tue, 27 Aug 2013 04:53:57 +0000 (14:53 +1000)
Fixes #4195

R=golang-dev, mikioh.mikioh
CC=golang-dev
https://golang.org/cl/12960046

src/pkg/net/fd_plan9.go
src/pkg/net/fd_unix.go
src/pkg/net/fd_windows.go
src/pkg/net/http/transport_test.go
src/pkg/net/sendfile_windows.go
src/pkg/net/timeout_test.go

index 84987c3a9e5675595f834887670a6faee4bced45..0d9dc54408680b38f33599f1189f3146185cad47 100644 (file)
@@ -18,8 +18,6 @@ type netFD struct {
        laddr, raddr     Addr
 }
 
-var canCancelIO = true // used for testing current package
-
 func sysInit() {
 }
 
index 58cfd04f35ace5c5c55fecadbc14d6222aea99dd..bdc2861d55d28acfa34ef9a3807d9f67604956a7 100644 (file)
@@ -33,8 +33,6 @@ type netFD struct {
        pd pollDesc
 }
 
-var canCancelIO = true // used for testing current package
-
 func sysInit() {
 }
 
index 78c75657479f1019e0841d5ade4dedbf1b7e77f7..75f7a63caa2962bd201f4beafc7d4f249def7e1d 100644 (file)
@@ -234,16 +234,20 @@ func (s *ioSrv) ExecIO(o *operation, name string, submit func(o *operation) erro
 }
 
 // Start helper goroutines.
-var iosrv *ioSrv
+var rsrv, wsrv *ioSrv
 var onceStartServer sync.Once
 
 func startServer() {
-       iosrv = new(ioSrv)
+       rsrv = new(ioSrv)
+       wsrv = new(ioSrv)
        if !canCancelIO {
-               // Only CancelIo API is available. Lets start special goroutine
-               // locked to an OS thread, that both starts and cancels IO.
-               iosrv.req = make(chan ioSrvReq)
-               go iosrv.ProcessRemoteIO()
+               // Only CancelIo API is available. Lets start two special goroutines
+               // locked to an OS thread, that both starts and cancels IO. One will
+               // process read requests, while other will do writes.
+               rsrv.req = make(chan ioSrvReq)
+               go rsrv.ProcessRemoteIO()
+               wsrv.req = make(chan ioSrvReq)
+               go wsrv.ProcessRemoteIO()
        }
 }
 
@@ -337,7 +341,7 @@ func (fd *netFD) connect(la, ra syscall.Sockaddr) error {
        // Call ConnectEx API.
        o := &fd.wop
        o.sa = ra
-       _, err := iosrv.ExecIO(o, "ConnectEx", func(o *operation) error {
+       _, err := wsrv.ExecIO(o, "ConnectEx", func(o *operation) error {
                return syscall.ConnectEx(o.fd.sysfd, o.sa, nil, 0, nil, &o.o)
        })
        if err != nil {
@@ -446,7 +450,7 @@ func (fd *netFD) Read(buf []byte) (int, error) {
        defer fd.readUnlock()
        o := &fd.rop
        o.InitBuf(buf)
-       n, err := iosrv.ExecIO(o, "WSARecv", func(o *operation) error {
+       n, err := rsrv.ExecIO(o, "WSARecv", func(o *operation) error {
                return syscall.WSARecv(o.fd.sysfd, &o.buf, 1, &o.qty, &o.flags, &o.o, nil)
        })
        if err == nil && n == 0 {
@@ -468,7 +472,7 @@ func (fd *netFD) ReadFrom(buf []byte) (n int, sa syscall.Sockaddr, err error) {
        defer fd.readUnlock()
        o := &fd.rop
        o.InitBuf(buf)
-       n, err = iosrv.ExecIO(o, "WSARecvFrom", func(o *operation) error {
+       n, err = rsrv.ExecIO(o, "WSARecvFrom", func(o *operation) error {
                if o.rsa == nil {
                        o.rsa = new(syscall.RawSockaddrAny)
                }
@@ -492,7 +496,7 @@ func (fd *netFD) Write(buf []byte) (int, error) {
        }
        o := &fd.wop
        o.InitBuf(buf)
-       return iosrv.ExecIO(o, "WSASend", func(o *operation) error {
+       return wsrv.ExecIO(o, "WSASend", func(o *operation) error {
                return syscall.WSASend(o.fd.sysfd, &o.buf, 1, &o.qty, 0, &o.o, nil)
        })
 }
@@ -508,7 +512,7 @@ func (fd *netFD) WriteTo(buf []byte, sa syscall.Sockaddr) (int, error) {
        o := &fd.wop
        o.InitBuf(buf)
        o.sa = sa
-       return iosrv.ExecIO(o, "WSASendto", func(o *operation) error {
+       return wsrv.ExecIO(o, "WSASendto", func(o *operation) error {
                return syscall.WSASendto(o.fd.sysfd, &o.buf, 1, &o.qty, 0, o.sa, &o.o, nil)
        })
 }
@@ -541,7 +545,7 @@ func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (*netFD, error) {
        o.handle = s
        var rawsa [2]syscall.RawSockaddrAny
        o.rsan = int32(unsafe.Sizeof(rawsa[0]))
-       _, err = iosrv.ExecIO(o, "AcceptEx", func(o *operation) error {
+       _, err = rsrv.ExecIO(o, "AcceptEx", func(o *operation) error {
                return syscall.AcceptEx(o.fd.sysfd, o.handle, (*byte)(unsafe.Pointer(&rawsa[0])), 0, uint32(o.rsan), uint32(o.rsan), &o.qty, &o.o)
        })
        if err != nil {
index df01a656679dbc08c11d238d4a5c2341bc58aa4e..e4df30a98de1c1da9af70d67800a1480edaf90fa 100644 (file)
@@ -830,7 +830,7 @@ func TestTransportPersistConnLeakShortBody(t *testing.T) {
        }
        nhigh := runtime.NumGoroutine()
        tr.CloseIdleConnections()
-       time.Sleep(50 * time.Millisecond)
+       time.Sleep(400 * time.Millisecond)
        runtime.GC()
        nfinal := runtime.NumGoroutine()
 
index 0107f679b3822595f20af43a41f4e78b906a461b..b128ba27b008fc51737868a2015dadd47da95e43 100644 (file)
@@ -42,7 +42,7 @@ func sendFile(fd *netFD, r io.Reader) (written int64, err error, handled bool) {
        o := &fd.wop
        o.qty = uint32(n)
        o.handle = syscall.Handle(f.Fd())
-       done, err := iosrv.ExecIO(o, "TransmitFile", func(o *operation) error {
+       done, err := wsrv.ExecIO(o, "TransmitFile", func(o *operation) error {
                return syscall.TransmitFile(o.fd.sysfd, o.handle, o.qty, 0, &o.o, nil, syscall.TF_WRITE_BEHIND)
        })
        if err != nil {
index 350ec8f7b1c1c52503ab6bba7f60553ff25a3db6..a14a88169b830a808918c621c6971ff36a73f662 100644 (file)
@@ -325,9 +325,6 @@ func TestReadWriteDeadline(t *testing.T) {
                t.Skipf("skipping test on %q", runtime.GOOS)
        }
 
-       if !canCancelIO {
-               t.Skip("skipping test on this system")
-       }
        const (
                readTimeout  = 50 * time.Millisecond
                writeTimeout = 250 * time.Millisecond