From 6c4888a1231a21d32d16b7f67c9f41cbf1933e53 Mon Sep 17 00:00:00 2001 From: Amanda Graven Date: Mon, 11 Jan 2021 13:15:47 +0100 Subject: [PATCH] Don't hold lock during await in name calculation --- matrix_sdk_base/src/rooms/normal.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/matrix_sdk_base/src/rooms/normal.rs b/matrix_sdk_base/src/rooms/normal.rs index 62003ac3..574d8627 100644 --- a/matrix_sdk_base/src/rooms/normal.rs +++ b/matrix_sdk_base/src/rooms/normal.rs @@ -220,7 +220,6 @@ impl Room { /// /// [spec]: /// - #[allow(clippy::await_holding_lock)] async fn calculate_name(&self) -> String { let inner = self.inner.read().unwrap(); @@ -233,14 +232,16 @@ impl Room { } else { // TODO what should we do here? We have correct counts only if lazy // loading is used. - let joined = inner.summary.joined_member_count; - let invited = inner.summary.invited_member_count; - let heroes_count = inner.summary.heroes.len() as u64; + let summary = inner.summary.clone(); + drop(inner); + let joined = summary.joined_member_count; + let invited = summary.invited_member_count; + let heroes_count = summary.heroes.len() as u64; let is_own_member = |m: &RoomMember| m.user_id() == &*self.own_user_id; let is_own_user_id = |u: &str| u == self.own_user_id().as_str(); - let members: Vec = if inner.summary.heroes.is_empty() { + let members: Vec = if summary.heroes.is_empty() { self.active_members() .await .filter(|m| future::ready(!is_own_member(m))) @@ -248,7 +249,7 @@ impl Room { .collect() .await } else { - stream::iter(inner.summary.heroes.iter()) + stream::iter(summary.heroes.iter()) .filter(|u| future::ready(!is_own_user_id(u))) .filter_map(|u| async move { let user_id = UserId::try_from(u.as_str()).ok()?; @@ -263,9 +264,10 @@ impl Room { self.room_id(), self.own_user_id, heroes_count, - inner.summary.heroes + summary.heroes ); + let inner = self.inner.read().unwrap(); inner .base_info .calculate_room_name(joined, invited, members)