-
Notifications
You must be signed in to change notification settings - Fork 198
/
logWriter.go
66 lines (52 loc) · 1.21 KB
/
logWriter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package logs
import (
"sync"
)
const msgQueueSize = 100
type logWriter struct {
mutChanClosed sync.RWMutex
chanClosed bool
dataChan chan []byte
}
// NewLogWriter creates a new chan-based
func NewLogWriter() *logWriter {
return &logWriter{
dataChan: make(chan []byte, msgQueueSize),
}
}
// Write will try to output the data on the channel
func (lw *logWriter) Write(p []byte) (n int, err error) {
if p == nil {
return 0, nil
}
lw.mutChanClosed.RLock()
defer lw.mutChanClosed.RUnlock()
if lw.chanClosed {
return 0, ErrWriterClosed
}
select {
case lw.dataChan <- p:
return len(p), nil
default:
return 0, ErrWriterBusy
}
}
// Close closes the writer by closing the underlying chan
// Subsequent calls of this method will return ErrWriterClosed
func (lw *logWriter) Close() error {
lw.mutChanClosed.Lock()
defer lw.mutChanClosed.Unlock()
if lw.chanClosed {
return ErrWriterClosed
}
lw.chanClosed = true
close(lw.dataChan)
return nil
}
// ReadBlocking will try to read from the data channel.
// It blocks until a new byte slice have been written with write method
// or the chan is closed
func (lw *logWriter) ReadBlocking() ([]byte, bool) {
data, ok := <-lw.dataChan
return data, ok
}