fix channel multiple close bug and concurrency bug in the way sessionInfo.close was being called

This commit is contained in:
Arceliar 2019-06-29 17:44:28 -05:00
parent 43bcb9e154
commit 7d58a7ef3e
2 changed files with 6 additions and 3 deletions

View File

@ -256,7 +256,7 @@ func (c *Conn) Close() error {
defer c.mutex.Unlock()
if c.session != nil {
// Close the session, if it hasn't been closed already
c.session.close()
c.core.router.doAdmin(c.session.close)
}
// This can't fail yet - TODO?
c.closed = true

View File

@ -269,8 +269,11 @@ func (ss *sessions) cleanup() {
// Closes a session, removing it from sessions maps and killing the worker goroutine.
func (sinfo *sessionInfo) close() {
delete(sinfo.core.sessions.sinfos, sinfo.myHandle)
delete(sinfo.core.sessions.byTheirPerm, sinfo.theirPermPub)
if s := sinfo.core.sessions.sinfos[sinfo.myHandle]; s == sinfo {
delete(sinfo.core.sessions.sinfos, sinfo.myHandle)
delete(sinfo.core.sessions.byTheirPerm, sinfo.theirPermPub)
}
defer func() { recover() }()
close(sinfo.worker)
}