-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathoverflow_handler.go
More file actions
51 lines (44 loc) · 1.15 KB
/
overflow_handler.go
File metadata and controls
51 lines (44 loc) · 1.15 KB
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
package clog
import (
"sync"
"sync/atomic"
)
// overflowHandler is a MemoryHandler that calls overflow func when the size of
// recorded messages reaches or exceeds the specified overflowSize.
type overflowHandler struct {
MemoryHandler
overflow func()
overflowSize int64
}
func newOverflowHandler(overflow func(*overflowHandler), overflowSize int64) (handler *overflowHandler) {
once := new(atomic.Pointer[sync.Once])
once.Store(new(sync.Once))
handleOverflow := func() {
once.Load().Do(func() {
defer once.Store(new(sync.Once))
defer handler.Reset()
overflow(handler)
})
}
handler = &overflowHandler{
MemoryHandler: *NewMemoryHandler(),
overflow: handleOverflow,
overflowSize: overflowSize,
}
return
}
// Transfers all buffered messages from the specified src to dest, if the src is an overflowHandler
func transferLogFromOverflowHandler(dst, src Handler) {
if ofh, ok := src.(*overflowHandler); ok && src != nil {
for ofh.TransferTo(dst) {
}
}
}
func (o *overflowHandler) LogEntry(entry LogEntry) error {
defer func() {
if o.Size() > o.overflowSize {
o.overflow()
}
}()
return o.MemoryHandler.LogEntry(entry)
}