]> Cypherpunks repositories - gostls13.git/commitdiff
net: don't loop to drain wakeup pipe.
authorIan Lance Taylor <iant@golang.org>
Sat, 12 Mar 2011 02:01:28 +0000 (18:01 -0800)
committerIan Lance Taylor <iant@golang.org>
Sat, 12 Mar 2011 02:01:28 +0000 (18:01 -0800)
The loop always makes an extra system call.  It only makes a
difference if more than 100 goroutines started waiting for
something to happen on a network file descriptor since the
last time the pipe was drained, which is unlikely since we
will be woken up the first time a goroutine starts waiting.
If we don't drain the pipe this time, we'll be woken up again
right away and can drain again.

R=rsc
CC=golang-dev
https://golang.org/cl/4275042

src/pkg/net/fd.go

index 2ba9296f315d321a306a79affec600f92f4abe3e..ad1a7c29a96d024d6ebfb5eefaa9105db132e125 100644 (file)
@@ -215,10 +215,10 @@ func (s *pollServer) Run() {
                        continue
                }
                if fd == s.pr.Fd() {
-                       // Drain our wakeup pipe.
-                       for nn, _ := s.pr.Read(scratch[0:]); nn > 0; {
-                               nn, _ = s.pr.Read(scratch[0:])
-                       }
+                       // Drain our wakeup pipe (we could loop here,
+                       // but it's unlikely that there are more than
+                       // len(scratch) wakeup calls).
+                       s.pr.Read(scratch[0:])
                        // Read from channels
                Update:
                        for {