}
}
}
+
+func ReadAll(r io.Reader, b []byte) ([]byte, error) {
+ b = b[0:cap(b)]
+ for {
+ n, err := r.Read(b[len(b):cap(b)])
+ b = b[:len(b)+n]
+ if err != nil {
+ if err == io.EOF {
+ err = nil
+ }
+ return b, err
+ }
+
+ if len(b) == cap(b) {
+ // Add more capacity (let append pick how much).
+ b = append(b, 0)[:len(b)]
+ }
+ }
+}
}
}
}
+
+func Test_readall(t *testing.T) {
+ var buf = []byte{}
+ result, e := ReadAll(bytes.NewReader([]byte{0x01, 0x02, 0x03}), buf)
+ if e != nil || !bytes.Equal(result, []byte{0x01, 0x02, 0x03}) {
+ t.Fatal()
+ }
+}
+
+// 4248350 281.0 ns/op 16 B/op 1 allocs/op
+func Benchmark_readall(b *testing.B) {
+ var buf = []byte{}
+ var data = []byte{0x01, 0x02, 0x03}
+ r := bytes.NewReader(data)
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ ReadAll(r, buf)
+ r.Reset(data)
+ }
+}
+
+// 2806576 424.2 ns/op 512 B/op 1 allocs/op
+func Benchmark_readall1(b *testing.B) {
+ var data = []byte{0x01, 0x02, 0x03}
+ r := bytes.NewReader(data)
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ io.ReadAll(r)
+ r.Reset(data)
+ }
+}
"sync"
"time"
+ "github.com/dustin/go-humanize"
"github.com/gorilla/websocket"
+ pio "github.com/qydysky/part/io"
msgq "github.com/qydysky/part/msgq"
)
o.l.Unlock()
}()
+ buf := make([]byte, humanize.KByte)
+ var message []byte
for {
if err := c.SetReadDeadline(time.Now().Add(time.Duration(o.RTOMs * int(time.Millisecond)))); err != nil {
o.error(err)
return
}
- msg_type, message, err := c.ReadMessage()
+ msg_type, r, err := c.NextReader()
+ if err == nil {
+ message, err = pio.ReadAll(r, buf)
+ }
if err != nil {
if e, ok := err.(*websocket.CloseError); ok {
switch e.Code {