output.go 870 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package kcp
  2. import (
  3. "io"
  4. "sync"
  5. "v2ray.com/core/common/alloc"
  6. )
  7. type SegmentWriter interface {
  8. Write(seg Segment)
  9. }
  10. type BufferedSegmentWriter struct {
  11. sync.Mutex
  12. mtu uint32
  13. buffer *alloc.Buffer
  14. writer io.Writer
  15. }
  16. func NewSegmentWriter(writer io.Writer, mtu uint32) *BufferedSegmentWriter {
  17. return &BufferedSegmentWriter{
  18. mtu: mtu,
  19. writer: writer,
  20. buffer: alloc.NewSmallBuffer(),
  21. }
  22. }
  23. func (v *BufferedSegmentWriter) Write(seg Segment) {
  24. v.Lock()
  25. defer v.Unlock()
  26. nBytes := seg.ByteSize()
  27. if uint32(v.buffer.Len()+nBytes) > v.mtu {
  28. v.FlushWithoutLock()
  29. }
  30. v.buffer.AppendFunc(seg.Bytes())
  31. }
  32. func (v *BufferedSegmentWriter) FlushWithoutLock() {
  33. v.writer.Write(v.buffer.Bytes())
  34. v.buffer.Clear()
  35. }
  36. func (v *BufferedSegmentWriter) Flush() {
  37. v.Lock()
  38. defer v.Unlock()
  39. if v.buffer.IsEmpty() {
  40. return
  41. }
  42. v.FlushWithoutLock()
  43. }