diff --git a/progress.go b/progress.go index 975d25e..771bb92 100644 --- a/progress.go +++ b/progress.go @@ -1,13 +1,9 @@ package mpb import ( - "fmt" "io" "os" - "os/signal" - "runtime" "sync" - "syscall" "time" "github.com/vbauerster/mpb/cwriter" @@ -172,73 +168,6 @@ case <-p.quit: default: close(p.quit) - } -} - -// server monitors underlying channels and renders any progress bars -func (p *Progress) server(conf pConf) { - winch := make(chan os.Signal, 1) - signal.Notify(winch, syscall.SIGWINCH) - - defer func() { - if conf.shutdownNotifier != nil { - close(conf.shutdownNotifier) - } - signal.Stop(winch) - close(p.done) - }() - - numP, numA := -1, -1 - - var timer *time.Timer - var resumeTicker <-chan time.Time - resumeDelay := 300 * time.Millisecond - - for { - select { - case op := <-p.ops: - op(&conf) - case <-conf.ticker.C: - if len(conf.bars) == 0 { - runtime.Gosched() - break - } - b0 := conf.bars[0] - if numP == -1 { - numP = b0.NumOfPrependers() - } - if numA == -1 { - numA = b0.NumOfAppenders() - } - tw, _, _ := cwriter.TermSize() - err := conf.writeAndFlush(tw, numP, numA) - if err != nil { - fmt.Fprintln(os.Stderr, err) - } - case <-winch: - tw, _, _ := cwriter.TermSize() - err := conf.writeAndFlush(tw-tw/8, numP, numA) - if err != nil { - fmt.Fprintln(os.Stderr, err) - } - if timer != nil && timer.Reset(resumeDelay) { - break - } - conf.ticker.Stop() - timer = time.NewTimer(resumeDelay) - resumeTicker = timer.C - case <-resumeTicker: - conf.ticker = time.NewTicker(conf.rr) - resumeTicker = nil - case <-conf.cancel: - conf.ticker.Stop() - conf.cancel = nil - case <-p.quit: - if conf.cancel != nil { - conf.ticker.Stop() - } - return - } } } diff --git a/progress_posix.go b/progress_posix.go new file mode 100644 index 0000000..cf75333 --- /dev/null +++ b/progress_posix.go @@ -0,0 +1,80 @@ +// +build !windows + +package mpb + +import ( + "fmt" + "os" + "os/signal" + "runtime" + "syscall" + "time" + + "github.com/vbauerster/mpb/cwriter" +) + +func (p *Progress) server(conf pConf) { + winch := make(chan os.Signal, 1) + signal.Notify(winch, syscall.SIGWINCH) + + defer func() { + if conf.shutdownNotifier != nil { + close(conf.shutdownNotifier) + } + signal.Stop(winch) + close(p.done) + }() + + numP, numA := -1, -1 + + var timer *time.Timer + var resumeTicker <-chan time.Time + resumeDelay := 300 * time.Millisecond + + for { + select { + case op := <-p.ops: + op(&conf) + case <-conf.ticker.C: + if len(conf.bars) == 0 { + runtime.Gosched() + break + } + b0 := conf.bars[0] + if numP == -1 { + numP = b0.NumOfPrependers() + } + if numA == -1 { + numA = b0.NumOfAppenders() + } + tw, _, _ := cwriter.TermSize() + err := conf.writeAndFlush(tw, numP, numA) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } + case <-winch: + tw, _, _ := cwriter.TermSize() + err := conf.writeAndFlush(tw-tw/8, numP, numA) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } + if timer != nil && timer.Reset(resumeDelay) { + break + } + conf.ticker.Stop() + timer = time.NewTimer(resumeDelay) + resumeTicker = timer.C + case <-resumeTicker: + conf.ticker = time.NewTicker(conf.rr) + resumeTicker = nil + case <-conf.cancel: + conf.ticker.Stop() + conf.cancel = nil + case <-p.quit: + if conf.cancel != nil { + conf.ticker.Stop() + } + return + } + } +} diff --git a/progress_windows.go b/progress_windows.go new file mode 100644 index 0000000..98f79bc --- /dev/null +++ b/progress_windows.go @@ -0,0 +1,54 @@ +// +build windows + +package mpb + +import ( + "fmt" + "os" + "runtime" + + "github.com/vbauerster/mpb/cwriter" +) + +func (p *Progress) server(conf pConf) { + defer func() { + if conf.shutdownNotifier != nil { + close(conf.shutdownNotifier) + } + close(p.done) + }() + + numP, numA := -1, -1 + + for { + select { + case op := <-p.ops: + op(&conf) + case <-conf.ticker.C: + if len(conf.bars) == 0 { + runtime.Gosched() + break + } + b0 := conf.bars[0] + if numP == -1 { + numP = b0.NumOfPrependers() + } + if numA == -1 { + numA = b0.NumOfAppenders() + } + tw, _, _ := cwriter.TermSize() + err := conf.writeAndFlush(tw, numP, numA) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } + case <-conf.cancel: + conf.ticker.Stop() + conf.cancel = nil + case <-p.quit: + if conf.cancel != nil { + conf.ticker.Stop() + } + return + } + } +}