Skip to content

Commit b7b47e2

Browse files
committed
go/procmgr protocol I/O: read as much as needed
refs #7600
1 parent e81ea1d commit b7b47e2

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

go/procmgr/complete-reader.go

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package main
2+
3+
import "io"
4+
5+
type completeReader struct {
6+
reader io.Reader
7+
}
8+
9+
var _ io.Reader = completeReader{}
10+
11+
func (cr completeReader) Read(p []byte) (n int, err error) {
12+
for len(p) > 0 {
13+
m, errRd := cr.reader.Read(p)
14+
n += m
15+
16+
if errRd != nil {
17+
err = errRd
18+
break
19+
}
20+
21+
p = p[m:]
22+
}
23+
24+
return
25+
}

go/procmgr/protocol.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func (sr *spawnRequest) ReadFrom(r io.Reader) (n int64, err error) {
6060
for _, rba := range rbas.from {
6161
buf := make([]byte, int(rba.length))
6262

63-
m, e := r.Read(buf)
63+
m, e := completeReader{r}.Read(buf)
6464
n += int64(m)
6565

6666
if e != nil {
@@ -123,7 +123,7 @@ type rawSpawnRequest struct {
123123
var _ io.ReaderFrom = (*rawSpawnRequest)(nil)
124124

125125
func (sr *rawSpawnRequest) ReadFrom(r io.Reader) (n int64, err error) {
126-
m, e := r.Read((*(*[unsafe.Sizeof(*sr)]byte)(unsafe.Pointer(sr)))[:])
126+
m, e := completeReader{r}.Read((*(*[unsafe.Sizeof(*sr)]byte)(unsafe.Pointer(sr)))[:])
127127
runtime.KeepAlive(sr)
128128

129129
return int64(m), e
@@ -154,7 +154,7 @@ type rawBytesArray32 struct {
154154
var _ io.ReaderFrom = (*rawBytesArray32)(nil)
155155

156156
func (ba *rawBytesArray32) ReadFrom(r io.Reader) (n int64, err error) {
157-
m, e := r.Read((*(*[unsafe.Sizeof(*ba)]byte)(unsafe.Pointer(ba)))[:])
157+
m, e := completeReader{r}.Read((*(*[unsafe.Sizeof(*ba)]byte)(unsafe.Pointer(ba)))[:])
158158
runtime.KeepAlive(ba)
159159

160160
return int64(m), e

0 commit comments

Comments
 (0)