]> Cypherpunks repositories - gostls13.git/commitdiff
internal/poll: only start Windows goroutines when we need them
authorIan Lance Taylor <iant@golang.org>
Sat, 4 Mar 2017 01:15:11 +0000 (17:15 -0800)
committerIan Lance Taylor <iant@golang.org>
Mon, 6 Mar 2017 19:57:39 +0000 (19:57 +0000)
We don't need to start the goroutines if the program isn't going to do
any I/O.

Fixes #19390.

Change-Id: I47eef992d3ad05ed5f3150f4d6e5b3e0cb16a551
Reviewed-on: https://go-review.googlesource.com/37762
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
src/internal/poll/fd_windows.go

index 16e70e6093a68452c6ef17e8776eb35c683e9daf..8f24bd65e5161d754790b6d951439c239ea7b1cf 100644 (file)
@@ -154,6 +154,10 @@ func (s *ioSrv) ProcessRemoteIO() {
 // is available. Alternatively, it passes the request onto
 // runtime netpoll and waits for completion or cancels request.
 func (s *ioSrv) ExecIO(o *operation, name string, submit func(o *operation) error) (int, error) {
+       if !canCancelIO {
+               onceStartServer.Do(startServer)
+       }
+
        fd := o.fd
        // Notify runtime netpoll about starting IO.
        err := fd.pd.prepare(int(o.mode))
@@ -229,21 +233,18 @@ func (s *ioSrv) ExecIO(o *operation, name string, submit func(o *operation) erro
 }
 
 // Start helper goroutines.
-var rsrv, wsrv *ioSrv
+var rsrv, wsrv ioSrv
 var onceStartServer sync.Once
 
 func startServer() {
-       rsrv = new(ioSrv)
-       wsrv = new(ioSrv)
-       if !canCancelIO {
-               // 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()
-       }
+       // This is called, once, when only the CancelIo API is available.
+       // Start two special goroutines, both locked to an OS thread,
+       // that start and cancel IO requests.
+       // One will process read requests, while the other will do writes.
+       rsrv.req = make(chan ioSrvReq)
+       go rsrv.ProcessRemoteIO()
+       wsrv.req = make(chan ioSrvReq)
+       go wsrv.ProcessRemoteIO()
 }
 
 // FD is a file descriptor. The net and os packages embed this type in
@@ -298,7 +299,6 @@ func (fd *FD) Init(net string) (string, error) {
        if initErr != nil {
                return "", initErr
        }
-       onceStartServer.Do(startServer)
 
        switch net {
        case "file":