72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
|
|
package stario
|
||
|
|
|
||
|
|
import "io"
|
||
|
|
|
||
|
|
// StarPipeReader is the read side returned by NewStarPipe.
|
||
|
|
type StarPipeReader struct {
|
||
|
|
buf *StarBuffer
|
||
|
|
}
|
||
|
|
|
||
|
|
// StarPipeWriter is the write side returned by NewStarPipe.
|
||
|
|
type StarPipeWriter struct {
|
||
|
|
buf *StarBuffer
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewStarPipe creates a buffered in-memory pipe backed by StarBuffer.
|
||
|
|
//
|
||
|
|
// The writer side uses Close to signal a graceful end-of-stream and Abort to
|
||
|
|
// fail both sides immediately.
|
||
|
|
func NewStarPipe(capacity uint64) (*StarPipeReader, *StarPipeWriter, error) {
|
||
|
|
buf, err := NewStarBuffer(capacity)
|
||
|
|
if err != nil {
|
||
|
|
return nil, nil, err
|
||
|
|
}
|
||
|
|
return &StarPipeReader{buf: buf}, &StarPipeWriter{buf: buf}, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// Read reads buffered bytes from the pipe.
|
||
|
|
func (reader *StarPipeReader) Read(p []byte) (int, error) {
|
||
|
|
if reader == nil || reader.buf == nil {
|
||
|
|
return 0, io.ErrClosedPipe
|
||
|
|
}
|
||
|
|
return reader.buf.Read(p)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Close aborts the pipe from the read side and wakes blocked writers.
|
||
|
|
func (reader *StarPipeReader) Close() error {
|
||
|
|
if reader == nil || reader.buf == nil {
|
||
|
|
return io.ErrClosedPipe
|
||
|
|
}
|
||
|
|
return reader.buf.Abort()
|
||
|
|
}
|
||
|
|
|
||
|
|
// Abort aborts the pipe from the read side and wakes blocked writers.
|
||
|
|
func (reader *StarPipeReader) Abort() error {
|
||
|
|
return reader.Close()
|
||
|
|
}
|
||
|
|
|
||
|
|
// Write writes bytes into the pipe buffer.
|
||
|
|
func (writer *StarPipeWriter) Write(p []byte) (int, error) {
|
||
|
|
if writer == nil || writer.buf == nil {
|
||
|
|
return 0, io.ErrClosedPipe
|
||
|
|
}
|
||
|
|
return writer.buf.Write(p)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Close gracefully closes the write side. Buffered bytes remain readable until
|
||
|
|
// drained.
|
||
|
|
func (writer *StarPipeWriter) Close() error {
|
||
|
|
if writer == nil || writer.buf == nil {
|
||
|
|
return io.ErrClosedPipe
|
||
|
|
}
|
||
|
|
return writer.buf.Close()
|
||
|
|
}
|
||
|
|
|
||
|
|
// Abort aborts the pipe immediately.
|
||
|
|
func (writer *StarPipeWriter) Abort() error {
|
||
|
|
if writer == nil || writer.buf == nil {
|
||
|
|
return io.ErrClosedPipe
|
||
|
|
}
|
||
|
|
return writer.buf.Abort()
|
||
|
|
}
|