diff --git a/application/application.go b/application/application.go index c75aa08..177da77 100644 --- a/application/application.go +++ b/application/application.go @@ -97,7 +97,8 @@ type Application struct { messageMu sync.Mutex // Relay messages received so users can add custom logic to // events. - messageChan chan *pb.CastMessage + messageChan chan *pb.CastMessage + closeChanOnce sync.Once // Functions that will receive messages from 'messageChan' messageFuncs []CastMessageFunc @@ -424,9 +425,9 @@ func (a *Application) Close(stopMedia bool) error { a.sendMediaConn(&cast.CloseHeader) a.sendDefaultConn(&cast.CloseHeader) } - defer func() { + defer a.closeChanOnce.Do(func() { close(a.messageChan) - }() + }) return a.conn.Close() } diff --git a/cast/connection.go b/cast/connection.go index 2167f8f..258b871 100644 --- a/cast/connection.go +++ b/cast/connection.go @@ -8,6 +8,7 @@ import ( "fmt" "io" "net" + "sync" "time" log "github.com/sirupsen/logrus" @@ -36,7 +37,8 @@ type Conn interface { type Connection struct { conn *tls.Conn - recvMsgChan chan *pb.CastMessage + recvMsgChan chan *pb.CastMessage + closeChanOnce sync.Once debug bool connected bool @@ -74,9 +76,9 @@ func (c *Connection) Close() error { if c.cancel != nil { c.cancel() } - defer func() { + defer c.closeChanOnce.Do(func() { close(c.recvMsgChan) - }() + }) return c.conn.Close() }