1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| //go:build !windows && !wasm && !illumos
| // +build !windows,!wasm,!illumos
|
| package buf
|
| import (
| "syscall"
| "unsafe"
| )
|
| type posixReader struct {
| iovecs []syscall.Iovec
| }
|
| func (r *posixReader) Init(bs []*Buffer) {
| iovecs := r.iovecs
| if iovecs == nil {
| iovecs = make([]syscall.Iovec, 0, len(bs))
| }
| for idx, b := range bs {
| iovecs = append(iovecs, syscall.Iovec{
| Base: &(b.v[0]),
| })
| iovecs[idx].SetLen(int(Size))
| }
| r.iovecs = iovecs
| }
|
| func (r *posixReader) Read(fd uintptr) int32 {
| n, _, e := syscall.Syscall(syscall.SYS_READV, fd, uintptr(unsafe.Pointer(&r.iovecs[0])), uintptr(len(r.iovecs)))
| if e != 0 {
| return -1
| }
| return int32(n)
| }
|
| func (r *posixReader) Clear() {
| for idx := range r.iovecs {
| r.iovecs[idx].Base = nil
| }
| r.iovecs = r.iovecs[:0]
| }
|
| func newMultiReader() multiReader {
| return &posixReader{}
| }
|
|