Simplify channel closing ordering

This commit is contained in:
Sergey Matveev 2015-11-04 17:37:58 +03:00 committed by User Mue
parent cd4faa7dd6
commit 493dc78a24

View File

@ -47,7 +47,7 @@ type Client struct {
away *string away *string
recvTimestamp time.Time recvTimestamp time.Time
sendTimestamp time.Time sendTimestamp time.Time
outBuf chan string outBuf chan *string
alive bool alive bool
sync.Mutex sync.Mutex
} }
@ -77,20 +77,19 @@ func NewClient(conn *proxyproto.Conn) *Client {
recvTimestamp: time.Now(), recvTimestamp: time.Now(),
sendTimestamp: time.Now(), sendTimestamp: time.Now(),
alive: true, alive: true,
outBuf: make(chan string, MaxOutBuf), outBuf: make(chan *string, MaxOutBuf),
} }
go c.MsgSender() go c.MsgSender()
return &c return &c
} }
func (c *Client) SetDead() { func (c *Client) SetDead() {
close(c.outBuf) c.outBuf <- nil
c.alive = false c.alive = false
} }
func (c *Client) Close() { func (c *Client) Close() {
c.Lock() c.Lock()
c.conn.Close()
if c.alive { if c.alive {
c.SetDead() c.SetDead()
} }
@ -134,7 +133,11 @@ func (c *Client) Processor(sink chan ClientEvent) {
func (c *Client) MsgSender() { func (c *Client) MsgSender() {
for msg := range c.outBuf { for msg := range c.outBuf {
c.conn.Write(append([]byte(msg), CRLF...)) if msg == nil {
c.conn.Close()
break
}
c.conn.Write(append([]byte(*msg), CRLF...))
} }
} }
@ -147,11 +150,12 @@ func (c *Client) Msg(text string) {
} }
if len(c.outBuf) == MaxOutBuf { if len(c.outBuf) == MaxOutBuf {
log.Println(c, "output buffer size exceeded, kicking him") log.Println(c, "output buffer size exceeded, kicking him")
go c.Close() if c.alive {
c.SetDead() c.SetDead()
}
return return
} }
c.outBuf <- text c.outBuf <- &text
} }
// Send message from server. It has ": servername" prefix. // Send message from server. It has ": servername" prefix.