go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/logger/buffer.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package logger
     5  
     6  import (
     7  	"bytes"
     8  	"io"
     9  	"sync"
    10  )
    11  
    12  func NewBufferedWriter(out io.Writer) io.Writer {
    13  	return &BufferedWriter{
    14  		out: out,
    15  	}
    16  }
    17  
    18  type BufferedWriter struct {
    19  	out    io.Writer
    20  	buf    bytes.Buffer
    21  	paused bool
    22  	lock   sync.RWMutex
    23  }
    24  
    25  func (bw *BufferedWriter) Pause() {
    26  	bw.lock.Lock()
    27  	defer bw.lock.Unlock()
    28  
    29  	bw.paused = true
    30  }
    31  
    32  func (bw *BufferedWriter) Resume() {
    33  	bw.lock.Lock()
    34  	defer bw.lock.Unlock()
    35  
    36  	if bw.paused == false {
    37  		return
    38  	}
    39  	bw.paused = false
    40  	bw.out.Write(bw.buf.Bytes())
    41  	bw.buf = bytes.Buffer{}
    42  }
    43  
    44  func (bw *BufferedWriter) Write(p []byte) (n int, err error) {
    45  	bw.lock.RLock()
    46  	defer bw.lock.RUnlock()
    47  
    48  	if bw.paused {
    49  		return bw.buf.Write(p)
    50  	}
    51  	return bw.out.Write(p)
    52  }