From c09f40a8cff4ff52d46c0d607bba3e0d4b5de7d0 Mon Sep 17 00:00:00 2001 From: Salman Alshamrani Date: Sun, 22 Jun 2025 06:51:39 +0300 Subject: [PATCH] Assert that `FetchWithCriteria` is called from the update thread --- osu.Game/Online/Leaderboards/LeaderboardManager.cs | 8 ++++++++ osu.Game/Screens/Ranking/SoloResultsScreen.cs | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/osu.Game/Online/Leaderboards/LeaderboardManager.cs b/osu.Game/Online/Leaderboards/LeaderboardManager.cs index 5750c83c97..632771afc1 100644 --- a/osu.Game/Online/Leaderboards/LeaderboardManager.cs +++ b/osu.Game/Online/Leaderboards/LeaderboardManager.cs @@ -7,6 +7,7 @@ using System.Diagnostics; using System.Linq; using osu.Framework.Allocation; using osu.Framework.Bindables; +using osu.Framework.Development; using osu.Framework.Graphics; using osu.Framework.Logging; using osu.Game.Beatmaps; @@ -24,7 +25,11 @@ namespace osu.Game.Online.Leaderboards { public partial class LeaderboardManager : Component { + /// + /// The latest leaderboard scores fetched by the criteria in . + /// public IBindable Scores => scores; + private readonly Bindable scores = new Bindable(); public LeaderboardCriteria? CurrentCriteria { get; private set; } @@ -47,6 +52,9 @@ namespace osu.Game.Online.Leaderboards /// public void FetchWithCriteria(LeaderboardCriteria newCriteria, bool forceRefresh = false) { + if (!ThreadSafety.IsUpdateThread) + throw new InvalidOperationException(@$"{nameof(FetchWithCriteria)} must be called from the update thread."); + if (!forceRefresh && CurrentCriteria?.Equals(newCriteria) == true && scores.Value?.FailState == null) return; diff --git a/osu.Game/Screens/Ranking/SoloResultsScreen.cs b/osu.Game/Screens/Ranking/SoloResultsScreen.cs index aeb21b09cb..df2414aaf0 100644 --- a/osu.Game/Screens/Ranking/SoloResultsScreen.cs +++ b/osu.Game/Screens/Ranking/SoloResultsScreen.cs @@ -54,7 +54,8 @@ namespace osu.Game.Screens.Ranking if (globalScores.Value != null && leaderboardManager.CurrentCriteria?.Equals(criteria) == true) requestTaskSource.TrySetResult(globalScores.Value); }); - leaderboardManager.FetchWithCriteria(criteria, forceRefresh: true); + + Schedule(() => leaderboardManager.FetchWithCriteria(criteria, forceRefresh: true)); var result = await requestTaskSource.Task.ConfigureAwait(false);