OLD | NEW |
1 // Copyright 2010 The Go Authors. All rights reserved. | 1 // Copyright 2010 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 package net | 5 package net |
6 | 6 |
7 import ( | 7 import ( |
8 "errors" | 8 "errors" |
9 "io" | 9 "io" |
10 "os" | 10 "os" |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 | 235 |
236 // wait server | 236 // wait server |
237 pd pollDesc | 237 pd pollDesc |
238 } | 238 } |
239 | 239 |
240 func newFD(sysfd syscall.Handle, family, sotype int, net string) (*netFD, error)
{ | 240 func newFD(sysfd syscall.Handle, family, sotype int, net string) (*netFD, error)
{ |
241 if initErr != nil { | 241 if initErr != nil { |
242 return nil, initErr | 242 return nil, initErr |
243 } | 243 } |
244 onceStartServer.Do(startServer) | 244 onceStartServer.Do(startServer) |
245 » fd := &netFD{ | 245 » return &netFD{sysfd: sysfd, family: family, sotype: sotype, net: net}, n
il |
246 » » sysfd: sysfd, | 246 } |
247 » » family: family, | 247 |
248 » » sotype: sotype, | 248 func (fd *netFD) init() error { |
249 » » net: net, | |
250 » } | |
251 if err := fd.pd.Init(fd); err != nil { | 249 if err := fd.pd.Init(fd); err != nil { |
252 » » return nil, err | 250 » » return err |
253 } | 251 } |
254 fd.rop.mode = 'r' | 252 fd.rop.mode = 'r' |
255 fd.wop.mode = 'w' | 253 fd.wop.mode = 'w' |
256 fd.rop.fd = fd | 254 fd.rop.fd = fd |
257 fd.wop.fd = fd | 255 fd.wop.fd = fd |
258 fd.rop.runtimeCtx = fd.pd.runtimeCtx | 256 fd.rop.runtimeCtx = fd.pd.runtimeCtx |
259 fd.wop.runtimeCtx = fd.pd.runtimeCtx | 257 fd.wop.runtimeCtx = fd.pd.runtimeCtx |
260 if !canCancelIO { | 258 if !canCancelIO { |
261 fd.rop.errc = make(chan error) | 259 fd.rop.errc = make(chan error) |
262 fd.rop.errc = make(chan error) | 260 fd.rop.errc = make(chan error) |
263 } | 261 } |
264 » return fd, nil | 262 » return nil |
265 } | 263 } |
266 | 264 |
267 func (fd *netFD) setAddr(laddr, raddr Addr) { | 265 func (fd *netFD) setAddr(laddr, raddr Addr) { |
268 fd.laddr = laddr | 266 fd.laddr = laddr |
269 fd.raddr = raddr | 267 fd.raddr = raddr |
270 runtime.SetFinalizer(fd, (*netFD).Close) | 268 runtime.SetFinalizer(fd, (*netFD).Close) |
271 } | 269 } |
272 | 270 |
273 func (fd *netFD) connect(la, ra syscall.Sockaddr) error { | 271 func (fd *netFD) connect(la, ra syscall.Sockaddr) error { |
274 if !canUseConnectEx(fd.net) { | 272 if !canUseConnectEx(fd.net) { |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
466 if err != nil { | 464 if err != nil { |
467 return nil, &OpError{"socket", fd.net, fd.laddr, err} | 465 return nil, &OpError{"socket", fd.net, fd.laddr, err} |
468 } | 466 } |
469 | 467 |
470 // Associate our new socket with IOCP. | 468 // Associate our new socket with IOCP. |
471 netfd, err := newFD(s, fd.family, fd.sotype, fd.net) | 469 netfd, err := newFD(s, fd.family, fd.sotype, fd.net) |
472 if err != nil { | 470 if err != nil { |
473 closesocket(s) | 471 closesocket(s) |
474 return nil, &OpError{"accept", fd.net, fd.laddr, err} | 472 return nil, &OpError{"accept", fd.net, fd.laddr, err} |
475 } | 473 } |
| 474 if err := netfd.init(); err != nil { |
| 475 fd.Close() |
| 476 return nil, err |
| 477 } |
476 | 478 |
477 // Submit accept request. | 479 // Submit accept request. |
478 o := &fd.rop | 480 o := &fd.rop |
479 o.mu.Lock() | 481 o.mu.Lock() |
480 defer o.mu.Unlock() | 482 defer o.mu.Unlock() |
481 o.handle = s | 483 o.handle = s |
482 var rawsa [2]syscall.RawSockaddrAny | 484 var rawsa [2]syscall.RawSockaddrAny |
483 o.rsan = int32(unsafe.Sizeof(rawsa[0])) | 485 o.rsan = int32(unsafe.Sizeof(rawsa[0])) |
484 _, err = iosrv.ExecIO(o, "AcceptEx", func(o *operation) error { | 486 _, err = iosrv.ExecIO(o, "AcceptEx", func(o *operation) error { |
485 return syscall.AcceptEx(o.fd.sysfd, o.handle, (*byte)(unsafe.Poi
nter(&rawsa[0])), 0, uint32(o.rsan), uint32(o.rsan), &o.qty, &o.o) | 487 return syscall.AcceptEx(o.fd.sysfd, o.handle, (*byte)(unsafe.Poi
nter(&rawsa[0])), 0, uint32(o.rsan), uint32(o.rsan), &o.qty, &o.o) |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 | 519 |
518 var errNoSupport = errors.New("address family not supported") | 520 var errNoSupport = errors.New("address family not supported") |
519 | 521 |
520 func (fd *netFD) ReadMsg(p []byte, oob []byte) (n, oobn, flags int, sa syscall.S
ockaddr, err error) { | 522 func (fd *netFD) ReadMsg(p []byte, oob []byte) (n, oobn, flags int, sa syscall.S
ockaddr, err error) { |
521 return 0, 0, 0, nil, errNoSupport | 523 return 0, 0, 0, nil, errNoSupport |
522 } | 524 } |
523 | 525 |
524 func (fd *netFD) WriteMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int, oob
n int, err error) { | 526 func (fd *netFD) WriteMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int, oob
n int, err error) { |
525 return 0, 0, errNoSupport | 527 return 0, 0, errNoSupport |
526 } | 528 } |
OLD | NEW |