chain_writer.go 764 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package io
  2. import (
  3. "io"
  4. "sync"
  5. "v2ray.com/core/common/buf"
  6. )
  7. type ChainWriter struct {
  8. sync.Mutex
  9. writer Writer
  10. }
  11. func NewChainWriter(writer Writer) *ChainWriter {
  12. return &ChainWriter{
  13. writer: writer,
  14. }
  15. }
  16. func (v *ChainWriter) Write(payload []byte) (int, error) {
  17. v.Lock()
  18. defer v.Unlock()
  19. if v.writer == nil {
  20. return 0, io.ErrClosedPipe
  21. }
  22. bytesWritten := 0
  23. size := len(payload)
  24. for size > 0 {
  25. buffer := buf.NewBuffer()
  26. nBytes, _ := buffer.Write(payload)
  27. size -= nBytes
  28. payload = payload[nBytes:]
  29. bytesWritten += nBytes
  30. err := v.writer.Write(buffer)
  31. if err != nil {
  32. return bytesWritten, err
  33. }
  34. }
  35. return bytesWritten, nil
  36. }
  37. func (v *ChainWriter) Release() {
  38. v.Lock()
  39. v.writer.Release()
  40. v.writer = nil
  41. v.Unlock()
  42. }