readv_windows.go 750 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. // +build windows
  2. package buf
  3. import "syscall"
  4. type windowsReader struct {
  5. bufs []syscall.WSABuf
  6. }
  7. func (r *windowsReader) Init(bs []*Buffer) {
  8. if r.bufs == nil {
  9. r.bufs = make([]syscall.WSABuf, 0, len(bs))
  10. }
  11. for _, b := range bs {
  12. r.bufs = append(r.bufs, syscall.WSABuf{Len: uint32(b.Len()), Buf: &b.v[0]})
  13. }
  14. }
  15. func (r *windowsReader) Clear() {
  16. for idx := range r.bufs {
  17. r.bufs[idx].Buf = nil
  18. }
  19. r.bufs = r.bufs[:0]
  20. }
  21. func (r *windowsReader) Read(fd uintptr) int32 {
  22. var nBytes uint32
  23. var flags uint32
  24. err := syscall.WSARecv(syscall.Handle(fd), &r.bufs[0], uint32(len(r.bufs)), &nBytes, &flags, nil, nil)
  25. if err != nil {
  26. return -1
  27. }
  28. return int32(nBytes)
  29. }
  30. func newMultiReader() multiReader {
  31. return new(windowsReader)
  32. }