From 97881b555df5b7fec4cb92eef7979f36bdb95aaa Mon Sep 17 00:00:00 2001 From: Jeremy Latt Date: Thu, 20 Feb 2014 11:51:45 -0800 Subject: [PATCH] async hostname lookups --- irc/client.go | 4 ++-- irc/server.go | 26 +++++++++++++++++++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/irc/client.go b/irc/client.go index 52b2d026..0da48c85 100644 --- a/irc/client.go +++ b/irc/client.go @@ -33,14 +33,14 @@ type Client struct { username string } -func NewClient(server *Server, conn net.Conn) *Client { +func NewClient(server *Server, conn net.Conn, hostname string) *Client { now := time.Now() client := &Client{ atime: now, channels: make(ChannelSet), ctime: now, flags: make(map[UserMode]bool), - hostname: AddrLookupHostname(conn.RemoteAddr()), + hostname: hostname, phase: server.InitPhase(), server: server, socket: NewSocket(conn), diff --git a/irc/server.go b/irc/server.go index 9d33a0c9..94cc2659 100644 --- a/irc/server.go +++ b/irc/server.go @@ -13,11 +13,27 @@ import ( "time" ) +type ConnData struct { + conn net.Conn + hostname string +} + +func NewConnData(conn net.Conn) *ConnData { + return &ConnData{ + conn: conn, + } +} + +func (data *ConnData) LookupHostname(newConns chan<- *ConnData) { + data.hostname = AddrLookupHostname(data.conn.RemoteAddr()) + newConns <- data +} + type Server struct { channels ChannelNameMap clients ClientNameMap commands chan Command - newConns chan net.Conn + newConns chan *ConnData ctime time.Time idle chan *Client motdFile string @@ -31,7 +47,7 @@ func NewServer(config *Config) *Server { channels: make(ChannelNameMap), clients: make(ClientNameMap), commands: make(chan Command), - newConns: make(chan net.Conn), + newConns: make(chan *ConnData), ctime: time.Now(), idle: make(chan *Client), motdFile: config.MOTD, @@ -54,8 +70,8 @@ func NewServer(config *Config) *Server { func (server *Server) ReceiveCommands() { for { select { - case conn := <-server.newConns: - NewClient(server, conn) + case data := <-server.newConns: + NewClient(server, data.conn, data.hostname) case client := <-server.idle: client.Idle() @@ -152,7 +168,7 @@ func (s *Server) listen(config ListenerConfig) { log.Printf("%s accept: %s", s, conn.RemoteAddr()) } - s.newConns <- conn + go NewConnData(conn).LookupHostname(s.newConns) } }