mirror of
https://github.com/fluencelabs/tendermint
synced 2025-05-17 09:01:19 +00:00
61 lines
1.1 KiB
Go
61 lines
1.1 KiB
Go
|
package peer
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
"net"
|
||
|
)
|
||
|
|
||
|
/* Listener */
|
||
|
|
||
|
type Listener struct {
|
||
|
listener net.Listener
|
||
|
handler func(net.Conn)
|
||
|
mtx sync.Mutex
|
||
|
closed bool
|
||
|
}
|
||
|
|
||
|
func NewListener(protocol string, laddr string, handler func(net.Conn)) *Listener {
|
||
|
ln, err := net.Listen(protocol, laddr)
|
||
|
if err != nil { panic(err) }
|
||
|
|
||
|
s := &Listener{
|
||
|
listener: ln,
|
||
|
handler: handler,
|
||
|
}
|
||
|
|
||
|
go s.listen()
|
||
|
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
func (s *Listener) listen() {
|
||
|
for {
|
||
|
conn, err := s.listener.Accept()
|
||
|
if err != nil {
|
||
|
// lock & defer
|
||
|
s.mtx.Lock(); defer s.mtx.Unlock()
|
||
|
if s.closed {
|
||
|
return
|
||
|
} else {
|
||
|
panic(err)
|
||
|
}
|
||
|
// unlock (deferred)
|
||
|
}
|
||
|
|
||
|
go s.handler(conn)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (s *Listener) LocalAddress() *NetAddress {
|
||
|
return NewNetAddress(s.listener.Addr())
|
||
|
}
|
||
|
|
||
|
func (s *Listener) Close() {
|
||
|
// lock
|
||
|
s.mtx.Lock()
|
||
|
s.closed = true
|
||
|
s.mtx.Unlock()
|
||
|
// unlock
|
||
|
s.listener.Close()
|
||
|
}
|