Snapshot channel tree maps under client lock
This commit is contained in:
committed by
Brandon McGinty
parent
4fe32ede70
commit
f629ce0359
+14
-15
@@ -89,15 +89,12 @@ func (b *Barnard) TreeItemBuild(item uiterm.TreeItem) []uiterm.TreeItem {
|
||||
|
||||
var treeItem TreeItem
|
||||
if ti, ok := item.(TreeItem); !ok {
|
||||
root := b.Client.Channels[0]
|
||||
var root *gumble.Channel
|
||||
b.Client.Do(func() { root = b.Client.Channels[0] })
|
||||
if root == nil {
|
||||
return nil
|
||||
}
|
||||
return []uiterm.TreeItem{
|
||||
TreeItem{
|
||||
Channel: root,
|
||||
},
|
||||
}
|
||||
return []uiterm.TreeItem{TreeItem{Channel: root}}
|
||||
} else {
|
||||
treeItem = ti
|
||||
}
|
||||
@@ -108,11 +105,17 @@ func (b *Barnard) TreeItemBuild(item uiterm.TreeItem) []uiterm.TreeItem {
|
||||
|
||||
users := []uiterm.TreeItem{}
|
||||
ul := []*gumble.User{}
|
||||
for _, user := range treeItem.Channel.Users {
|
||||
ul = append(ul, user)
|
||||
var u = ul[len(ul)-1]
|
||||
_ = u
|
||||
}
|
||||
cl := []*gumble.Channel{}
|
||||
// TCP handlers mutate both maps; snapshot them while Client.Do holds its
|
||||
// read lock, then sort/render outside the protocol critical section.
|
||||
b.Client.Do(func() {
|
||||
for _, user := range treeItem.Channel.Users {
|
||||
ul = append(ul, user)
|
||||
}
|
||||
for _, subchannel := range treeItem.Channel.Children {
|
||||
cl = append(cl, subchannel)
|
||||
}
|
||||
})
|
||||
sort.Slice(ul, func(i, j int) bool {
|
||||
return ul[i].Name < ul[j].Name
|
||||
})
|
||||
@@ -123,10 +126,6 @@ func (b *Barnard) TreeItemBuild(item uiterm.TreeItem) []uiterm.TreeItem {
|
||||
}
|
||||
|
||||
channels := []uiterm.TreeItem{}
|
||||
cl := []*gumble.Channel{}
|
||||
for _, subchannel := range treeItem.Channel.Children {
|
||||
cl = append(cl, subchannel)
|
||||
}
|
||||
sort.Slice(cl, func(i, j int) bool {
|
||||
return cl[i].Name < cl[j].Name
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user