Left: | ||
Right: |
LEFT | RIGHT |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
LEFT | RIGHT |