Don't use syscall.SIGWINCH for windows builds
Vladimir Bauer
8 years ago
| 0 | 0 |
package mpb
|
| 1 | 1 |
|
| 2 | 2 |
import (
|
| 3 | |
"fmt"
|
| 4 | 3 |
"io"
|
| 5 | 4 |
"os"
|
| 6 | |
"os/signal"
|
| 7 | |
"runtime"
|
| 8 | 5 |
"sync"
|
| 9 | |
"syscall"
|
| 10 | 6 |
"time"
|
| 11 | 7 |
|
| 12 | 8 |
"github.com/vbauerster/mpb/cwriter"
|
|
| 171 | 167 |
case <-p.quit:
|
| 172 | 168 |
default:
|
| 173 | 169 |
close(p.quit)
|
| 174 | |
}
|
| 175 | |
}
|
| 176 | |
|
| 177 | |
// server monitors underlying channels and renders any progress bars
|
| 178 | |
func (p *Progress) server(conf pConf) {
|
| 179 | |
winch := make(chan os.Signal, 1)
|
| 180 | |
signal.Notify(winch, syscall.SIGWINCH)
|
| 181 | |
|
| 182 | |
defer func() {
|
| 183 | |
if conf.shutdownNotifier != nil {
|
| 184 | |
close(conf.shutdownNotifier)
|
| 185 | |
}
|
| 186 | |
signal.Stop(winch)
|
| 187 | |
close(p.done)
|
| 188 | |
}()
|
| 189 | |
|
| 190 | |
numP, numA := -1, -1
|
| 191 | |
|
| 192 | |
var timer *time.Timer
|
| 193 | |
var resumeTicker <-chan time.Time
|
| 194 | |
resumeDelay := 300 * time.Millisecond
|
| 195 | |
|
| 196 | |
for {
|
| 197 | |
select {
|
| 198 | |
case op := <-p.ops:
|
| 199 | |
op(&conf)
|
| 200 | |
case <-conf.ticker.C:
|
| 201 | |
if len(conf.bars) == 0 {
|
| 202 | |
runtime.Gosched()
|
| 203 | |
break
|
| 204 | |
}
|
| 205 | |
b0 := conf.bars[0]
|
| 206 | |
if numP == -1 {
|
| 207 | |
numP = b0.NumOfPrependers()
|
| 208 | |
}
|
| 209 | |
if numA == -1 {
|
| 210 | |
numA = b0.NumOfAppenders()
|
| 211 | |
}
|
| 212 | |
tw, _, _ := cwriter.TermSize()
|
| 213 | |
err := conf.writeAndFlush(tw, numP, numA)
|
| 214 | |
if err != nil {
|
| 215 | |
fmt.Fprintln(os.Stderr, err)
|
| 216 | |
}
|
| 217 | |
case <-winch:
|
| 218 | |
tw, _, _ := cwriter.TermSize()
|
| 219 | |
err := conf.writeAndFlush(tw-tw/8, numP, numA)
|
| 220 | |
if err != nil {
|
| 221 | |
fmt.Fprintln(os.Stderr, err)
|
| 222 | |
}
|
| 223 | |
if timer != nil && timer.Reset(resumeDelay) {
|
| 224 | |
break
|
| 225 | |
}
|
| 226 | |
conf.ticker.Stop()
|
| 227 | |
timer = time.NewTimer(resumeDelay)
|
| 228 | |
resumeTicker = timer.C
|
| 229 | |
case <-resumeTicker:
|
| 230 | |
conf.ticker = time.NewTicker(conf.rr)
|
| 231 | |
resumeTicker = nil
|
| 232 | |
case <-conf.cancel:
|
| 233 | |
conf.ticker.Stop()
|
| 234 | |
conf.cancel = nil
|
| 235 | |
case <-p.quit:
|
| 236 | |
if conf.cancel != nil {
|
| 237 | |
conf.ticker.Stop()
|
| 238 | |
}
|
| 239 | |
return
|
| 240 | |
}
|
| 241 | 170 |
}
|
| 242 | 171 |
}
|
| 243 | 172 |
|
|
0 |
// +build !windows
|
|
1 |
|
|
2 |
package mpb
|
|
3 |
|
|
4 |
import (
|
|
5 |
"fmt"
|
|
6 |
"os"
|
|
7 |
"os/signal"
|
|
8 |
"runtime"
|
|
9 |
"syscall"
|
|
10 |
"time"
|
|
11 |
|
|
12 |
"github.com/vbauerster/mpb/cwriter"
|
|
13 |
)
|
|
14 |
|
|
15 |
func (p *Progress) server(conf pConf) {
|
|
16 |
winch := make(chan os.Signal, 1)
|
|
17 |
signal.Notify(winch, syscall.SIGWINCH)
|
|
18 |
|
|
19 |
defer func() {
|
|
20 |
if conf.shutdownNotifier != nil {
|
|
21 |
close(conf.shutdownNotifier)
|
|
22 |
}
|
|
23 |
signal.Stop(winch)
|
|
24 |
close(p.done)
|
|
25 |
}()
|
|
26 |
|
|
27 |
numP, numA := -1, -1
|
|
28 |
|
|
29 |
var timer *time.Timer
|
|
30 |
var resumeTicker <-chan time.Time
|
|
31 |
resumeDelay := 300 * time.Millisecond
|
|
32 |
|
|
33 |
for {
|
|
34 |
select {
|
|
35 |
case op := <-p.ops:
|
|
36 |
op(&conf)
|
|
37 |
case <-conf.ticker.C:
|
|
38 |
if len(conf.bars) == 0 {
|
|
39 |
runtime.Gosched()
|
|
40 |
break
|
|
41 |
}
|
|
42 |
b0 := conf.bars[0]
|
|
43 |
if numP == -1 {
|
|
44 |
numP = b0.NumOfPrependers()
|
|
45 |
}
|
|
46 |
if numA == -1 {
|
|
47 |
numA = b0.NumOfAppenders()
|
|
48 |
}
|
|
49 |
tw, _, _ := cwriter.TermSize()
|
|
50 |
err := conf.writeAndFlush(tw, numP, numA)
|
|
51 |
if err != nil {
|
|
52 |
fmt.Fprintln(os.Stderr, err)
|
|
53 |
}
|
|
54 |
case <-winch:
|
|
55 |
tw, _, _ := cwriter.TermSize()
|
|
56 |
err := conf.writeAndFlush(tw-tw/8, numP, numA)
|
|
57 |
if err != nil {
|
|
58 |
fmt.Fprintln(os.Stderr, err)
|
|
59 |
}
|
|
60 |
if timer != nil && timer.Reset(resumeDelay) {
|
|
61 |
break
|
|
62 |
}
|
|
63 |
conf.ticker.Stop()
|
|
64 |
timer = time.NewTimer(resumeDelay)
|
|
65 |
resumeTicker = timer.C
|
|
66 |
case <-resumeTicker:
|
|
67 |
conf.ticker = time.NewTicker(conf.rr)
|
|
68 |
resumeTicker = nil
|
|
69 |
case <-conf.cancel:
|
|
70 |
conf.ticker.Stop()
|
|
71 |
conf.cancel = nil
|
|
72 |
case <-p.quit:
|
|
73 |
if conf.cancel != nil {
|
|
74 |
conf.ticker.Stop()
|
|
75 |
}
|
|
76 |
return
|
|
77 |
}
|
|
78 |
}
|
|
79 |
}
|
|
0 |
// +build windows
|
|
1 |
|
|
2 |
package mpb
|
|
3 |
|
|
4 |
import (
|
|
5 |
"fmt"
|
|
6 |
"os"
|
|
7 |
"runtime"
|
|
8 |
|
|
9 |
"github.com/vbauerster/mpb/cwriter"
|
|
10 |
)
|
|
11 |
|
|
12 |
func (p *Progress) server(conf pConf) {
|
|
13 |
defer func() {
|
|
14 |
if conf.shutdownNotifier != nil {
|
|
15 |
close(conf.shutdownNotifier)
|
|
16 |
}
|
|
17 |
close(p.done)
|
|
18 |
}()
|
|
19 |
|
|
20 |
numP, numA := -1, -1
|
|
21 |
|
|
22 |
for {
|
|
23 |
select {
|
|
24 |
case op := <-p.ops:
|
|
25 |
op(&conf)
|
|
26 |
case <-conf.ticker.C:
|
|
27 |
if len(conf.bars) == 0 {
|
|
28 |
runtime.Gosched()
|
|
29 |
break
|
|
30 |
}
|
|
31 |
b0 := conf.bars[0]
|
|
32 |
if numP == -1 {
|
|
33 |
numP = b0.NumOfPrependers()
|
|
34 |
}
|
|
35 |
if numA == -1 {
|
|
36 |
numA = b0.NumOfAppenders()
|
|
37 |
}
|
|
38 |
tw, _, _ := cwriter.TermSize()
|
|
39 |
err := conf.writeAndFlush(tw, numP, numA)
|
|
40 |
if err != nil {
|
|
41 |
fmt.Fprintln(os.Stderr, err)
|
|
42 |
}
|
|
43 |
case <-conf.cancel:
|
|
44 |
conf.ticker.Stop()
|
|
45 |
conf.cancel = nil
|
|
46 |
case <-p.quit:
|
|
47 |
if conf.cancel != nil {
|
|
48 |
conf.ticker.Stop()
|
|
49 |
}
|
|
50 |
return
|
|
51 |
}
|
|
52 |
}
|
|
53 |
}
|