Skip to content

Commit ac01c4e

Browse files
committed
tlio.RingWriter
1 parent 4267c04 commit ac01c4e

File tree

1 file changed

+46
-20
lines changed

1 file changed

+46
-20
lines changed

tlio/writers.go

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,21 @@ type (
3434

3535
TailWriter struct {
3636
io.Writer
37-
n int
38-
39-
i int
40-
buf [][]byte
37+
RingWriter
4138
}
4239

4340
HeadWriter struct {
4441
io.Writer
4542
N int
4643
}
4744

45+
RingWriter struct {
46+
n int
47+
48+
i int
49+
buf [][]byte
50+
}
51+
4852
// CountingIODiscard discards data but counts writes and bytes.
4953
// It's safe to use simultaneously (atomic operations are used).
5054
CountingIODiscard struct {
@@ -288,13 +292,38 @@ func (w *DeLabels) Unwrap() interface{} {
288292

289293
func NewTailWriter(w io.Writer, n int) *TailWriter {
290294
return &TailWriter{
291-
Writer: w,
292-
n: n,
293-
buf: make([][]byte, n),
295+
Writer: w,
296+
RingWriter: RingWriter{},
294297
}
295298
}
296299

297-
func (w *TailWriter) Write(p []byte) (n int, err error) {
300+
func (w *TailWriter) Flush() (err error) {
301+
_, err = w.RingWriter.WriteTo(w.Writer)
302+
if err != nil {
303+
return err
304+
}
305+
306+
w.RingWriter.Reset()
307+
308+
if f, ok := w.Writer.(Flusher); ok {
309+
return f.Flush()
310+
}
311+
312+
return nil
313+
}
314+
315+
func (w *TailWriter) Unwrap() interface{} {
316+
return w.Writer
317+
}
318+
319+
func NewRingWriter(n int) *RingWriter {
320+
return &RingWriter{
321+
n: n,
322+
buf: make([][]byte, n),
323+
}
324+
}
325+
326+
func (w *RingWriter) Write(p []byte) (n int, err error) {
298327
i := w.i % w.n
299328
w.buf[i] = append(w.buf[i][:0], p...)
300329

@@ -303,31 +332,28 @@ func (w *TailWriter) Write(p []byte) (n int, err error) {
303332
return len(p), nil
304333
}
305334

306-
func (w *TailWriter) Flush() (err error) {
335+
func (w *RingWriter) WriteTo(wr io.Writer) (n int64, err error) {
307336
for i := w.i; i < w.i+w.n; i++ {
308337
b := w.buf[i%w.n]
309338

310339
if len(b) == 0 {
311340
continue
312341
}
313342

314-
_, err = w.Writer.Write(b)
343+
m, err := wr.Write(b)
344+
n += int64(m)
315345
if err != nil {
316-
return err
346+
return n, err
317347
}
318-
319-
w.buf[i%w.n] = b[:0]
320-
}
321-
322-
if f, ok := w.Writer.(Flusher); ok {
323-
return f.Flush()
324348
}
325349

326-
return nil
350+
return n, nil
327351
}
328352

329-
func (w *TailWriter) Unwrap() interface{} {
330-
return w.Writer
353+
func (w *RingWriter) Reset() {
354+
for i := range w.buf {
355+
w.buf[i] = w.buf[i][:0]
356+
}
331357
}
332358

333359
func NewHeadWriter(w io.Writer, n int) *HeadWriter {

0 commit comments

Comments
 (0)