Skip to content

Commit

Permalink
修复Manager关闭过程中添加Session可能导致关闭过程永久等待的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
bg5sbk committed Dec 16, 2016
1 parent c655345 commit 42d7f16
Showing 1 changed file with 10 additions and 12 deletions.
22 changes: 10 additions & 12 deletions manager.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package link

import (
"sync"
"sync/atomic"
)
import "sync"

const sessionMapNum = 32

Expand All @@ -15,8 +12,8 @@ type Manager struct {

type sessionMap struct {
sync.RWMutex
sessions map[uint64]*Session
disposeFlag uint32
sessions map[uint64]*Session
disposed bool
}

func NewManager() *Manager {
Expand All @@ -32,7 +29,7 @@ func (manager *Manager) Dispose() {
for i := 0; i < sessionMapNum; i++ {
smap := &manager.sessionMaps[i]
smap.Lock()
atomic.StoreUint32(&smap.disposeFlag, 1)
smap.disposed = true
for _, session := range smap.sessions {
session.Close()
}
Expand All @@ -59,21 +56,22 @@ func (manager *Manager) GetSession(sessionID uint64) *Session {

func (manager *Manager) putSession(session *Session) {
smap := &manager.sessionMaps[session.id%sessionMapNum]

smap.Lock()
defer smap.Unlock()

if smap.disposed {
session.Close()
return
}

smap.sessions[session.id] = session
manager.disposeWait.Add(1)
}

func (manager *Manager) delSession(session *Session) {
smap := &manager.sessionMaps[session.id%sessionMapNum]

if atomic.LoadUint32(&smap.disposeFlag) == 1 {
manager.disposeWait.Done()
return
}

smap.Lock()
defer smap.Unlock()

Expand Down

0 comments on commit 42d7f16

Please sign in to comment.