mirror of
https://github.com/golang/go
synced 2024-11-24 22:57:57 -07:00
net: reuse channels during io
R=golang-dev, bsiegert, rsc, hectorchu CC=golang-dev https://golang.org/cl/5016043
This commit is contained in:
parent
96f9e8837e
commit
310e5fe60c
@ -52,15 +52,27 @@ type anOp struct {
|
|||||||
// of the struct, as our code rely on it.
|
// of the struct, as our code rely on it.
|
||||||
o syscall.Overlapped
|
o syscall.Overlapped
|
||||||
|
|
||||||
resultc chan ioResult // io completion results
|
resultc chan ioResult
|
||||||
errnoc chan int // io submit / cancel operation errors
|
errnoc chan int
|
||||||
fd *netFD
|
fd *netFD
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *anOp) Init(fd *netFD) {
|
func (o *anOp) Init(fd *netFD, mode int) {
|
||||||
o.fd = fd
|
o.fd = fd
|
||||||
o.resultc = make(chan ioResult, 1)
|
var i int
|
||||||
o.errnoc = make(chan int)
|
if mode == 'r' {
|
||||||
|
i = 0
|
||||||
|
} else {
|
||||||
|
i = 1
|
||||||
|
}
|
||||||
|
if fd.resultc[i] == nil {
|
||||||
|
fd.resultc[i] = make(chan ioResult, 1)
|
||||||
|
}
|
||||||
|
o.resultc = fd.resultc[i]
|
||||||
|
if fd.errnoc[i] == nil {
|
||||||
|
fd.errnoc[i] = make(chan int)
|
||||||
|
}
|
||||||
|
o.errnoc = fd.errnoc[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *anOp) Op() *anOp {
|
func (o *anOp) Op() *anOp {
|
||||||
@ -74,8 +86,8 @@ type bufOp struct {
|
|||||||
buf syscall.WSABuf
|
buf syscall.WSABuf
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *bufOp) Init(fd *netFD, buf []byte) {
|
func (o *bufOp) Init(fd *netFD, buf []byte, mode int) {
|
||||||
o.anOp.Init(fd)
|
o.anOp.Init(fd, mode)
|
||||||
o.buf.Len = uint32(len(buf))
|
o.buf.Len = uint32(len(buf))
|
||||||
if len(buf) == 0 {
|
if len(buf) == 0 {
|
||||||
o.buf.Buf = nil
|
o.buf.Buf = nil
|
||||||
@ -214,6 +226,8 @@ type netFD struct {
|
|||||||
net string
|
net string
|
||||||
laddr Addr
|
laddr Addr
|
||||||
raddr Addr
|
raddr Addr
|
||||||
|
resultc [2]chan ioResult // read/write completion results
|
||||||
|
errnoc [2]chan int // read/write submit or cancel operation errors
|
||||||
|
|
||||||
// owned by client
|
// owned by client
|
||||||
rdeadline_delta int64
|
rdeadline_delta int64
|
||||||
@ -325,7 +339,7 @@ func (fd *netFD) Read(buf []byte) (n int, err os.Error) {
|
|||||||
return 0, os.EINVAL
|
return 0, os.EINVAL
|
||||||
}
|
}
|
||||||
var o readOp
|
var o readOp
|
||||||
o.Init(fd, buf)
|
o.Init(fd, buf, 'r')
|
||||||
n, err = iosrv.ExecIO(&o, fd.rdeadline_delta)
|
n, err = iosrv.ExecIO(&o, fd.rdeadline_delta)
|
||||||
if err == nil && n == 0 {
|
if err == nil && n == 0 {
|
||||||
err = os.EOF
|
err = os.EOF
|
||||||
@ -365,7 +379,7 @@ func (fd *netFD) ReadFrom(buf []byte) (n int, sa syscall.Sockaddr, err os.Error)
|
|||||||
return 0, nil, os.EINVAL
|
return 0, nil, os.EINVAL
|
||||||
}
|
}
|
||||||
var o readFromOp
|
var o readFromOp
|
||||||
o.Init(fd, buf)
|
o.Init(fd, buf, 'r')
|
||||||
o.rsan = int32(unsafe.Sizeof(o.rsa))
|
o.rsan = int32(unsafe.Sizeof(o.rsa))
|
||||||
n, err = iosrv.ExecIO(&o, fd.rdeadline_delta)
|
n, err = iosrv.ExecIO(&o, fd.rdeadline_delta)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -402,7 +416,7 @@ func (fd *netFD) Write(buf []byte) (n int, err os.Error) {
|
|||||||
return 0, os.EINVAL
|
return 0, os.EINVAL
|
||||||
}
|
}
|
||||||
var o writeOp
|
var o writeOp
|
||||||
o.Init(fd, buf)
|
o.Init(fd, buf, 'w')
|
||||||
return iosrv.ExecIO(&o, fd.wdeadline_delta)
|
return iosrv.ExecIO(&o, fd.wdeadline_delta)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -437,7 +451,7 @@ func (fd *netFD) WriteTo(buf []byte, sa syscall.Sockaddr) (n int, err os.Error)
|
|||||||
return 0, os.EINVAL
|
return 0, os.EINVAL
|
||||||
}
|
}
|
||||||
var o writeToOp
|
var o writeToOp
|
||||||
o.Init(fd, buf)
|
o.Init(fd, buf, 'w')
|
||||||
o.sa = sa
|
o.sa = sa
|
||||||
return iosrv.ExecIO(&o, fd.wdeadline_delta)
|
return iosrv.ExecIO(&o, fd.wdeadline_delta)
|
||||||
}
|
}
|
||||||
@ -487,7 +501,7 @@ func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (nfd *netFD, err os.
|
|||||||
|
|
||||||
// Submit accept request.
|
// Submit accept request.
|
||||||
var o acceptOp
|
var o acceptOp
|
||||||
o.Init(fd)
|
o.Init(fd, 'r')
|
||||||
o.newsock = s
|
o.newsock = s
|
||||||
_, err = iosrv.ExecIO(&o, 0)
|
_, err = iosrv.ExecIO(&o, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -54,7 +54,7 @@ func sendFile(c *netFD, r io.Reader) (written int64, err os.Error, handled bool)
|
|||||||
defer c.decref()
|
defer c.decref()
|
||||||
|
|
||||||
var o sendfileOp
|
var o sendfileOp
|
||||||
o.Init(c)
|
o.Init(c, 'w')
|
||||||
o.n = uint32(n)
|
o.n = uint32(n)
|
||||||
o.src = f.Fd()
|
o.src = f.Fd()
|
||||||
done, err := iosrv.ExecIO(&o, 0)
|
done, err := iosrv.ExecIO(&o, 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user