Browse Source

member-list: Separate inserting and updating members

It might update already existing members that objects might be watching so we
have to drop the mutable borrow first.
merge-requests/1327/merge
Kévin Commaille 4 years ago
parent
commit
bf91e99bbb
No known key found for this signature in database
GPG Key ID: DD507DAE96E8245C
  1. 26
      src/session/room/member_list.rs

26
src/session/room/member_list.rs

@ -1,5 +1,5 @@
use gtk::{gio, glib, prelude::*, subclass::prelude::*};
use indexmap::IndexMap;
use indexmap::{map::Entry, IndexMap};
use matrix_sdk::ruma::{
events::{room::member::RoomMemberEventContent, OriginalSyncStateEvent},
OwnedUserId, UserId,
@ -106,19 +106,29 @@ impl MemberList {
/// If some of the values do not correspond to existing members, new members
/// are created.
pub fn update_from_room_members(&self, new_members: &[matrix_sdk::room::RoomMember]) {
let mut members = self.imp().members.borrow_mut();
let priv_ = self.imp();
let mut members = priv_.members.borrow_mut();
let prev_len = members.len();
for member in new_members {
members
.entry(member.user_id().into())
.or_insert_with_key(|user_id| Member::new(&self.room(), user_id))
.update_from_room_member(member);
if let Entry::Vacant(entry) = members.entry(member.user_id().into()) {
entry.insert(Member::new(&self.room(), member.user_id()));
}
}
let num_members_added = members.len().saturating_sub(prev_len);
// We can't have the borrow active when items_changed is emitted because that
// will probably cause reads of the members field.
// We can't have the borrow active when members are updated or items_changed is
// emitted because that will probably cause reads of the members field.
std::mem::drop(members);
{
let members = priv_.members.borrow();
for room_member in new_members {
if let Some(member) = members.get(room_member.user_id()) {
member.update_from_room_member(room_member);
}
}
}
if num_members_added > 0 {
// IndexMap preserves insertion order, so all the new items will be at the end.
self.items_changed(prev_len as u32, 0, num_members_added as u32);

Loading…
Cancel
Save