-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtimepool.go
120 lines (99 loc) · 1.74 KB
/
timepool.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package bp
import (
"time"
)
type TickerPool struct {
pool chan *time.Ticker
}
func (b *TickerPool) GetRef(dur time.Duration) *TickerRef {
t := b.Get(dur)
ref := newTickerRef(t, b)
ref.setFinalizer()
return ref
}
func (b *TickerPool) Get(dur time.Duration) *time.Ticker {
select {
case t := <-b.pool:
// reuse exists pool
t.Reset(dur)
return t
default:
// create *time.Ticker
return time.NewTicker(dur)
}
}
func (b *TickerPool) Put(t *time.Ticker) bool {
t.Stop()
select {
case b.pool <- t:
return true
default:
return false
}
}
func (b *TickerPool) Len() int {
return len(b.pool)
}
func (b *TickerPool) Cap() int {
return cap(b.pool)
}
func NewTickerPool(poolSize int, funcs ...optionFunc) *TickerPool {
opt := newOption()
for _, fn := range funcs {
fn(opt)
}
return &TickerPool{
pool: make(chan *time.Ticker, poolSize),
}
}
type TimerPool struct {
pool chan *time.Timer
}
func (b *TimerPool) GetRef(dur time.Duration) *TimerRef {
t := b.Get(dur)
ref := newTimerRef(t, b)
ref.setFinalizer()
return ref
}
func (b *TimerPool) Get(dur time.Duration) *time.Timer {
select {
case t := <-b.pool:
// reuse exists pool
t.Reset(dur)
return t
default:
// create *time.Ticker
return time.NewTimer(dur)
}
}
func (b *TimerPool) Put(t *time.Timer) bool {
if t.Stop() != true {
select {
case <-t.C:
// drain
default:
// free
}
}
select {
case b.pool <- t:
return true
default:
return false
}
}
func (b *TimerPool) Len() int {
return len(b.pool)
}
func (b *TimerPool) Cap() int {
return cap(b.pool)
}
func NewTimerPool(poolSize int, funcs ...optionFunc) *TimerPool {
opt := newOption()
for _, fn := range funcs {
fn(opt)
}
return &TimerPool{
pool: make(chan *time.Timer, poolSize),
}
}