forked from ZezhongWang/iperf-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtimer.go
63 lines (56 loc) · 1.26 KB
/
timer.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
package main
import "time"
type ITimer struct{
timer *time.Timer
done chan bool
}
type ITicker struct{
ticker *time.Ticker
done chan bool
}
type TimerClientData struct{
p interface{}
}
type timerProc func(data TimerClientData, now time.Time)
func timer_create(now time.Time, proc timerProc, data TimerClientData, dur uint /* in ms */) ITimer{
real_dur := time.Now().Sub(now) + time.Duration(dur)*time.Millisecond
timer := time.NewTimer(real_dur)
done := make(chan bool, 1)
go func(){
defer timer.Stop()
for {
select {
case <- done:
log.Debugf("Timer recv done. dur: %v", dur)
return
case t := <- timer.C:
proc(data, t)
}
}
}()
itimer := ITimer{timer:timer, done: done}
return itimer
}
func ticker_create(now time.Time, proc timerProc, data TimerClientData, interval uint /* in ms */, max_times uint) ITicker{
ticker := time.NewTicker(time.Duration(interval) * time.Millisecond)
done := make(chan bool, 1)
go func(){
var cnt uint = 0
defer ticker.Stop()
for {
select {
case <- done:
log.Debugf("Ticker recv done. interval:%v", interval)
return
case t := <- ticker.C:
if cnt >= max_times{
return
}
proc(data, t)
cnt ++
}
}
}()
iticker := ITicker{ticker:ticker, done: done}
return iticker
}