Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(1)

Delta Between Two Patch Sets: src/pkg/net/fd_unix.go

Issue 6496054: code review 6496054: net: spread fd over several pollservers. (Closed)
Left Patch Set: diff -r 979c5e5b1308 https://code.google.com/p/go/ Created 11 years, 6 months ago
Right Patch Set: diff -r cfbcf8176d26 https://code.google.com/p/go/ Created 11 years, 6 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « no previous file | src/pkg/net/sendfile_freebsd.go » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 // Copyright 2009 The Go Authors. All rights reserved. 1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style 2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file. 3 // license that can be found in the LICENSE file.
4 4
5 // +build darwin freebsd linux netbsd openbsd 5 // +build darwin freebsd linux netbsd openbsd
6 6
7 package net 7 package net
8 8
9 import ( 9 import (
10 "errors" 10 "errors"
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 for i := 0; i < pollMaxN; i++ { 275 for i := 0; i < pollMaxN; i++ {
276 k := i 276 k := i
277 once := new(sync.Once) 277 once := new(sync.Once)
278 startServersOnce[i] = func() { once.Do(func() { startServer(k) } ) } 278 startServersOnce[i] = func() { once.Do(func() { startServer(k) } ) }
279 } 279 }
280 } 280 }
281 281
282 func startServer(k int) { 282 func startServer(k int) {
283 p, err := newPollServer() 283 p, err := newPollServer()
284 if err != nil { 284 if err != nil {
285 panic(err) 285 panic(err)
dfc 2012/09/20 11:12:49 if any error from newPollServer is a panic, newPol
286 } 286 }
287 pollservers[k] = p 287 pollservers[k] = p
288 } 288 }
289 289
290 func server(fd int) *pollServer {
291 pollN := runtime.GOMAXPROCS(0)
292 if pollN > pollMaxN {
293 pollN = pollMaxN
294 }
295 k := fd % pollN
296 startServersOnce[k]()
297 return pollservers[k]
298 }
299
290 func newFD(fd, family, sotype int, net string) (*netFD, error) { 300 func newFD(fd, family, sotype int, net string) (*netFD, error) {
291 if err := syscall.SetNonblock(fd, true); err != nil { 301 if err := syscall.SetNonblock(fd, true); err != nil {
292 return nil, err 302 return nil, err
293 } 303 }
294 netfd := &netFD{ 304 netfd := &netFD{
295 sysfd: fd, 305 sysfd: fd,
296 family: family, 306 family: family,
297 sotype: sotype, 307 sotype: sotype,
298 net: net, 308 net: net,
299 } 309 }
300 netfd.cr = make(chan error, 1) 310 netfd.cr = make(chan error, 1)
301 netfd.cw = make(chan error, 1) 311 netfd.cw = make(chan error, 1)
302 312 » netfd.pollServer = server(fd)
303 » pollN := runtime.GOMAXPROCS(0)
dvyukov 2012/09/20 19:22:20 Please move this out of newFD(). This change addre
304 » if pollN > pollMaxN {
305 » » pollN = pollMaxN
306 » }
307 » k := fd % pollN
308 » startServersOnce[k]()
bradfitz 2012/09/20 18:43:18 this line may crash if GOMAXPROCS has increased si
dvyukov 2012/09/20 19:15:11 init() does not call GOMAXPROCS, it calls NumCPU()
bradfitz 2012/09/20 19:18:06 sorry, I see. Teaches me to read code on a bus.
309 » netfd.pollServer = pollservers[k]
310
311 return netfd, nil 313 return netfd, nil
312 } 314 }
313 315
314 func (fd *netFD) setAddr(laddr, raddr Addr) { 316 func (fd *netFD) setAddr(laddr, raddr Addr) {
315 fd.laddr = laddr 317 fd.laddr = laddr
316 fd.raddr = raddr 318 fd.raddr = raddr
317 var ls, rs string 319 var ls, rs string
318 if laddr != nil { 320 if laddr != nil {
319 ls = laddr.String() 321 ls = laddr.String()
320 } 322 }
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 } 604 }
603 return 605 return
604 } 606 }
605 607
606 func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (netfd *netFD, err e rror) { 608 func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (netfd *netFD, err e rror) {
607 if err := fd.incref(false); err != nil { 609 if err := fd.incref(false); err != nil {
608 return nil, err 610 return nil, err
609 } 611 }
610 defer fd.decref() 612 defer fd.decref()
611 613
612 » // See ../syscall/exec.go for description of ForkLock. 614 » // See ../syscall/exec_unix.go for description of ForkLock.
613 // It is okay to hold the lock across syscall.Accept 615 // It is okay to hold the lock across syscall.Accept
614 // because we have put fd.sysfd into non-blocking mode. 616 // because we have put fd.sysfd into non-blocking mode.
615 var s int 617 var s int
616 var rsa syscall.Sockaddr 618 var rsa syscall.Sockaddr
617 for { 619 for {
618 syscall.ForkLock.RLock() 620 syscall.ForkLock.RLock()
619 s, rsa, err = syscall.Accept(fd.sysfd) 621 s, rsa, err = syscall.Accept(fd.sysfd)
620 if err != nil { 622 if err != nil {
621 syscall.ForkLock.RUnlock() 623 syscall.ForkLock.RUnlock()
622 if err == syscall.EAGAIN { 624 if err == syscall.EAGAIN {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 if err = syscall.SetNonblock(ns, false); err != nil { 663 if err = syscall.SetNonblock(ns, false); err != nil {
662 return nil, &OpError{"setnonblock", fd.net, fd.laddr, err} 664 return nil, &OpError{"setnonblock", fd.net, fd.laddr, err}
663 } 665 }
664 666
665 return os.NewFile(uintptr(ns), fd.sysfile.Name()), nil 667 return os.NewFile(uintptr(ns), fd.sysfile.Name()), nil
666 } 668 }
667 669
668 func closesocket(s int) error { 670 func closesocket(s int) error {
669 return syscall.Close(s) 671 return syscall.Close(s)
670 } 672 }
LEFTRIGHT

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b