Skip to content

Commit

Permalink
use bounded goroutines
Browse files Browse the repository at this point in the history
  • Loading branch information
Joe Henke committed Mar 15, 2019
1 parent a96e638 commit c130692
Showing 1 changed file with 14 additions and 19 deletions.
33 changes: 14 additions & 19 deletions lumberjack.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import (
"sort"
"strings"
"sync"
"sync/atomic"
"time"
)

Expand Down Expand Up @@ -111,8 +112,8 @@ type Logger struct {
file *os.File
mu sync.Mutex

millCh chan bool
startMill sync.Once
millQueue int32
millMu sync.Mutex
}

var (
Expand Down Expand Up @@ -302,6 +303,14 @@ func (l *Logger) filename() string {
// files are removed, keeping at most l.MaxBackups files, as long as
// none of them are older than MaxAge.
func (l *Logger) millRunOnce() error {

// ensure only one mill worker is working at once
l.millMu.Lock()
defer l.millMu.Unlock()

// decrement mill queue to 0 to allow another goroutine to queue up
atomic.StoreInt32(&l.millQueue, 0)

if l.MaxBackups == 0 && l.MaxAge == 0 && !l.Compress {
return nil
}
Expand Down Expand Up @@ -373,25 +382,11 @@ func (l *Logger) millRunOnce() error {
return err
}

// millRun runs in a goroutine to manage post-rotation compression and removal
// of old log files.
func (l *Logger) millRun() {
for _ = range l.millCh {
// what am I going to do, log this?
_ = l.millRunOnce()
}
}

// mill performs post-rotation compression and removal of stale log files,
// starting the mill goroutine if necessary.
// starting a mill goroutine if necessary.
func (l *Logger) mill() {
l.startMill.Do(func() {
l.millCh = make(chan bool, 1)
go l.millRun()
})
select {
case l.millCh <- true:
default:
if atomic.CompareAndSwapInt32(&l.millQueue, 0, 1) {
go l.millRunOnce()
}
}

Expand Down

0 comments on commit c130692

Please sign in to comment.