-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathutil.go
48 lines (42 loc) · 1.17 KB
/
util.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
/*
Copyright 2020-Present Couchbase, Inc.
Use of this software is governed by the Business Source License included in
the file licenses/BSL-Couchbase.txt. As of the Change Date specified in that
file, in accordance with the Business Source License, use of this software will
be governed by the Apache License, Version 2.0, included in the file
licenses/APL2.txt.
*/
package blip
import (
"sync/atomic"
"time"
)
// waitForZeroActiveGoroutines blocks until either the number of activeGoroutines has reached zero, or we give up waiting.
func waitForZeroActiveGoroutines(logCtx *Context, activeGoroutines *int32) {
timeout := time.After(time.Second * 5)
ticker := time.NewTicker(time.Millisecond * 25)
defer ticker.Stop()
for {
select {
case <-timeout:
logCtx.log("timed out waiting for goroutines to finish")
return // timed out
case <-ticker.C:
if atomic.LoadInt32(activeGoroutines) > 0 {
continue
}
return // all done
}
}
}
// errorFromChannel returns an error if there's one in the given channel, otherwise returns nil.
func errorFromChannel(c chan error) error {
select {
case err := <-c:
if err != nil {
return err
}
default:
}
return nil
}