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) p.AddIPAddr(ra)
onRecv, onIdle := make(chan *response), make(chan bool) 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} 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 onIdle <- true
})
if err != nil {
fmt.Println(err)
os.Exit(1)
} }
p.MaxRTT = time.Second p.MaxRTT = time.Second

View File

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

View File

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