1
0
mirror of https://github.com/taigrr/go-fastping synced 2025-01-18 05:03:15 -08:00

Add OnRecv and OnIdle field to Pinger. AddHandler is deprecated

This commit is contained in:
Tatsushi Demachi 2014-10-16 21:01:45 +09:00
parent 2ce592c234
commit bbe9a51966
3 changed files with 38 additions and 67 deletions

View File

@ -38,19 +38,11 @@ func main() {
p.AddIPAddr(ra)
onRecv, onIdle := make(chan *response), make(chan bool)
err = p.AddHandler("receive", func(addr *net.IPAddr, t time.Duration) {
p.OnRecv = func(addr *net.IPAddr, t time.Duration) {
onRecv <- &response{addr: addr, rtt: t}
})
if err != nil {
fmt.Println(err)
os.Exit(1)
}
err = p.AddHandler("idle", func() {
p.OnIdle = func() {
onIdle <- true
})
if err != nil {
fmt.Println(err)
os.Exit(1)
}
p.MaxRTT = time.Second

View File

@ -14,19 +14,11 @@
// os.Exit(1)
// }
// p.AddIPAddr(ra)
// err = p.AddHandler("receive", func(addr *net.IPAddr, rtt time.Duration) {
// p.OnRecv = func(addr *net.IPAddr, rtt time.Duration) {
// fmt.Printf("IP Addr: %s receive, RTT: %v\n", addr.String(), rtt)
// })
// if err != nil {
// fmt.Println(err)
// os.Exit(1)
// }
// err = p.AddHandler("idle", func() {
// p.OnIdle = func() {
// fmt.Println("finish")
// })
// if err != nil {
// fmt.Println(err)
// os.Exit(1)
// }
// err = p.Run()
// if err != nil {
@ -112,7 +104,11 @@ type Pinger struct {
// the library calls an idle callback function. It is also used for an
// interval time of RunLoop() method
MaxRTT time.Duration
handlers map[string]interface{}
// OnRecv is called with a response packet's source address and its
// elapsed time when Pinger receives a response packet.
OnRecv func(*net.IPAddr, time.Duration)
// OnIdle is called when MaxRTT time passed
OnIdle func()
// If Debug is true, it prints debug messages to stdout.
Debug bool
}
@ -127,7 +123,8 @@ func NewPinger() *Pinger {
hasIPv4: false,
hasIPv6: false,
MaxRTT: time.Second,
handlers: make(map[string]interface{}),
OnRecv: nil,
OnIdle: nil,
Debug: false,
}
}
@ -166,6 +163,9 @@ func (p *Pinger) AddIPAddr(ip *net.IPAddr) {
// AddHandler adds event handler to Pinger. event arg should be "receive" or
// "idle" string.
//
// **CAUTION** This function is deprecated. Please use OnRecv and OnIdle field
// of Pinger struct to set following handlers.
//
// "receive" handler should be
//
// func(addr *net.IPAddr, rtt time.Duration)
@ -184,7 +184,7 @@ func (p *Pinger) AddHandler(event string, handler interface{}) error {
case "receive":
if hdl, ok := handler.(func(*net.IPAddr, time.Duration)); ok {
p.mu.Lock()
p.handlers[event] = hdl
p.OnRecv = hdl
p.mu.Unlock()
return nil
}
@ -192,7 +192,7 @@ func (p *Pinger) AddHandler(event string, handler interface{}) error {
case "idle":
if hdl, ok := handler.(func()); ok {
p.mu.Lock()
p.handlers[event] = hdl
p.OnIdle = hdl
p.mu.Unlock()
return nil
}
@ -333,12 +333,10 @@ mainloop:
break mainloop
case <-ticker.C:
p.mu.Lock()
handler, ok := p.handlers["idle"]
handler := p.OnIdle
p.mu.Unlock()
if ok && handler != nil {
if hdl, ok := handler.(func()); ok {
hdl()
}
if handler != nil {
handler()
}
if once || err != nil {
break mainloop
@ -512,12 +510,10 @@ func (p *Pinger) procRecv(recv *packet, queue map[string]*net.IPAddr) {
if _, ok := queue[addr]; ok {
delete(queue, addr)
p.mu.Lock()
handler, ok := p.handlers["receive"]
handler := p.OnRecv
p.mu.Unlock()
if ok && handler != nil {
if hdl, ok := handler.(func(*net.IPAddr, time.Duration)); ok {
hdl(recv.addr, rtt)
}
if handler != nil {
handler(recv.addr, rtt)
}
}
}

View File

@ -54,7 +54,7 @@ func TestRun(t *testing.T) {
found1, found100, foundv6 := false, false, false
called, idle := false, false
err := p.AddHandler("receive", func(ip *net.IPAddr, d time.Duration) {
p.OnRecv = func(ip *net.IPAddr, d time.Duration) {
called = true
if ip.String() == "127.0.0.1" {
found1 = true
@ -63,19 +63,13 @@ func TestRun(t *testing.T) {
} else if ip.String() == "::1" {
foundv6 = true
}
})
if err != nil {
t.Fatalf("Failed to add receive hander: %v", err)
}
err = p.AddHandler("idle", func() {
p.OnIdle = func() {
idle = true
})
if err != nil {
t.Fatalf("Failed to add idle handler: %v", err)
}
err = p.Run()
err := p.Run()
if err != nil {
t.Fatalf("Pinger returns error: %v", err)
}
@ -110,23 +104,17 @@ func TestMultiRun(t *testing.T) {
var mu sync.Mutex
res1 := 0
err := p1.AddHandler("receive", func(*net.IPAddr, time.Duration) {
p1.OnRecv = func(*net.IPAddr, time.Duration) {
mu.Lock()
res1++
mu.Unlock()
})
if err != nil {
t.Fatalf("Failed to add receive hander: %v", err)
}
res2 := 0
err = p2.AddHandler("receive", func(*net.IPAddr, time.Duration) {
p2.OnRecv = func(*net.IPAddr, time.Duration) {
mu.Lock()
res2++
mu.Unlock()
})
if err != nil {
t.Fatalf("Failed to add idle handler: %v", err)
}
p1.MaxRTT, p2.MaxRTT = time.Millisecond*100, time.Millisecond*100
@ -194,20 +182,15 @@ func TestRunLoop(t *testing.T) {
p.MaxRTT = time.Millisecond * 100
recvCount, idleCount := 0, 0
err := p.AddHandler("receive", func(*net.IPAddr, time.Duration) {
p.OnRecv = func(*net.IPAddr, time.Duration) {
recvCount++
})
if err != nil {
t.Fatalf("Failed to add receive handler: %v", err)
}
err = p.AddHandler("idle", func() {
p.OnIdle = func() {
idleCount++
})
if err != nil {
t.Fatalf("Failed to add idle handler: %v", err)
}
var err error
p.RunLoop()
ticker := time.NewTicker(time.Millisecond * 250)
select {