mirror of https://github.com/cbeuw/Cloak
Fix a deadlock
This commit is contained in:
parent
360f84c5d5
commit
d2b17fc9a2
|
|
@ -33,10 +33,10 @@ func MakeUserPanel(manager usermanager.UserManager) *userPanel {
|
|||
// GetBypassUser does the same as GetUser except it unconditionally creates an ActiveUser when the UID isn't already active
|
||||
func (panel *userPanel) GetBypassUser(UID []byte) (*ActiveUser, error) {
|
||||
panel.activeUsersM.Lock()
|
||||
defer panel.activeUsersM.Unlock()
|
||||
var arrUID [16]byte
|
||||
copy(arrUID[:], UID)
|
||||
if user, ok := panel.activeUsers[arrUID]; ok {
|
||||
panel.activeUsersM.Unlock()
|
||||
return user, nil
|
||||
}
|
||||
user := &ActiveUser{
|
||||
|
|
@ -47,7 +47,6 @@ func (panel *userPanel) GetBypassUser(UID []byte) (*ActiveUser, error) {
|
|||
}
|
||||
copy(user.arrUID[:], UID)
|
||||
panel.activeUsers[user.arrUID] = user
|
||||
panel.activeUsersM.Unlock()
|
||||
return user, nil
|
||||
}
|
||||
|
||||
|
|
@ -55,16 +54,15 @@ func (panel *userPanel) GetBypassUser(UID []byte) (*ActiveUser, error) {
|
|||
// UID with UserInfo queried from the UserManger, should the particular UID is allowed to connect
|
||||
func (panel *userPanel) GetUser(UID []byte) (*ActiveUser, error) {
|
||||
panel.activeUsersM.Lock()
|
||||
defer panel.activeUsersM.Unlock()
|
||||
var arrUID [16]byte
|
||||
copy(arrUID[:], UID)
|
||||
if user, ok := panel.activeUsers[arrUID]; ok {
|
||||
panel.activeUsersM.Unlock()
|
||||
return user, nil
|
||||
}
|
||||
|
||||
upRate, downRate, err := panel.Manager.AuthenticateUser(UID)
|
||||
if err != nil {
|
||||
panel.activeUsersM.Unlock()
|
||||
return nil, err
|
||||
}
|
||||
valve := mux.MakeValve(upRate, downRate)
|
||||
|
|
@ -76,7 +74,6 @@ func (panel *userPanel) GetUser(UID []byte) (*ActiveUser, error) {
|
|||
|
||||
copy(user.arrUID[:], UID)
|
||||
panel.activeUsers[user.arrUID] = user
|
||||
panel.activeUsersM.Unlock()
|
||||
return user, nil
|
||||
}
|
||||
|
||||
|
|
@ -150,6 +147,7 @@ func (panel *userPanel) updateUsageQueueForOne(user *ActiveUser) {
|
|||
// and act to each user according to the responses
|
||||
func (panel *userPanel) commitUpdate() error {
|
||||
panel.usageUpdateQueueM.Lock()
|
||||
defer panel.usageUpdateQueueM.Unlock()
|
||||
statuses := make([]usermanager.StatusUpdate, 0, len(panel.usageUpdateQueue))
|
||||
for arrUID, usage := range panel.usageUpdateQueue {
|
||||
panel.activeUsersM.RLock()
|
||||
|
|
@ -188,7 +186,6 @@ func (panel *userPanel) commitUpdate() error {
|
|||
}
|
||||
}
|
||||
panel.usageUpdateQueue = make(map[[16]byte]*usagePair)
|
||||
panel.usageUpdateQueueM.Unlock()
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue