mirror of https://github.com/ppy/osu
Merge pull request #24295 from peppy/fix-multiplayer-deadlock
Fix deadlock when logging out while at the create match screen
This commit is contained in:
commit
7800ea9841
|
@ -23,6 +23,7 @@
|
|||
using osu.Game.Audio;
|
||||
using osu.Game.Beatmaps;
|
||||
using osu.Game.Input.Bindings;
|
||||
using osu.Game.Online.API;
|
||||
using osu.Game.Online.Rooms;
|
||||
using osu.Game.Overlays;
|
||||
using osu.Game.Overlays.Mods;
|
||||
|
@ -76,6 +77,9 @@ public abstract partial class RoomSubScreen : OnlinePlaySubScreen, IPreviewTrack
|
|||
[Resolved]
|
||||
private RulesetStore rulesets { get; set; }
|
||||
|
||||
[Resolved]
|
||||
private IAPIProvider api { get; set; } = null!;
|
||||
|
||||
[Resolved(canBeNull: true)]
|
||||
protected OnlinePlayScreen ParentScreen { get; private set; }
|
||||
|
||||
|
@ -284,6 +288,8 @@ protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnl
|
|||
[Resolved(canBeNull: true)]
|
||||
private IDialogOverlay dialogOverlay { get; set; }
|
||||
|
||||
protected virtual bool IsConnected => api.State.Value == APIState.Online;
|
||||
|
||||
public override bool OnBackButton()
|
||||
{
|
||||
if (Room.RoomID.Value == null)
|
||||
|
@ -356,7 +362,12 @@ private bool ensureExitConfirmed()
|
|||
if (ExitConfirmed)
|
||||
return true;
|
||||
|
||||
if (dialogOverlay == null || Room.RoomID.Value != null || Room.Playlist.Count == 0)
|
||||
if (!IsConnected)
|
||||
return true;
|
||||
|
||||
bool hasUnsavedChanges = Room.RoomID.Value == null && Room.Playlist.Count > 0;
|
||||
|
||||
if (dialogOverlay == null || !hasUnsavedChanges)
|
||||
return true;
|
||||
|
||||
// if the dialog is already displayed, block exiting until the user explicitly makes a decision.
|
||||
|
|
|
@ -41,7 +41,7 @@ public override void OnResuming(ScreenTransitionEvent e)
|
|||
// To work around this, temporarily remove the room and trigger an immediate listing poll.
|
||||
if (e.Last is MultiplayerMatchSubScreen match)
|
||||
{
|
||||
RoomManager.RemoveRoom(match.Room);
|
||||
RoomManager?.RemoveRoom(match.Room);
|
||||
ListingPollingComponent.PollImmediately();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
using osu.Game.Configuration;
|
||||
using osu.Game.Graphics.Cursor;
|
||||
using osu.Game.Online;
|
||||
using osu.Game.Online.API;
|
||||
using osu.Game.Online.Multiplayer;
|
||||
using osu.Game.Online.Rooms;
|
||||
using osu.Game.Overlays;
|
||||
|
@ -50,9 +49,6 @@ public partial class MultiplayerMatchSubScreen : RoomSubScreen, IHandlePresentBe
|
|||
[Resolved]
|
||||
private MultiplayerClient client { get; set; }
|
||||
|
||||
[Resolved]
|
||||
private IAPIProvider api { get; set; }
|
||||
|
||||
[Resolved(canBeNull: true)]
|
||||
private OsuGame game { get; set; }
|
||||
|
||||
|
@ -79,6 +75,8 @@ protected override void LoadComplete()
|
|||
handleRoomLost();
|
||||
}
|
||||
|
||||
protected override bool IsConnected => base.IsConnected && client.IsConnected.Value;
|
||||
|
||||
protected override Drawable CreateMainContent() => new Container
|
||||
{
|
||||
RelativeSizeAxes = Axes.Both,
|
||||
|
@ -254,13 +252,9 @@ protected override void UpdateMods()
|
|||
|
||||
public override bool OnExiting(ScreenExitEvent e)
|
||||
{
|
||||
// the room may not be left immediately after a disconnection due to async flow,
|
||||
// so checking the MultiplayerClient / IAPIAccess statuses is also required.
|
||||
if (client.Room == null || !client.IsConnected.Value || api.State.Value != APIState.Online)
|
||||
{
|
||||
// room has not been created yet or we're offline; exit immediately.
|
||||
// room has not been created yet or we're offline; exit immediately.
|
||||
if (client.Room == null || !IsConnected)
|
||||
return base.OnExiting(e);
|
||||
}
|
||||
|
||||
if (!exitConfirmed && dialogOverlay != null)
|
||||
{
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||
// See the LICENCE file in the repository root for full licence text.
|
||||
|
||||
#nullable disable
|
||||
|
||||
using osu.Framework.Allocation;
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Framework.Screens;
|
||||
|
@ -15,8 +13,8 @@ public abstract partial class OnlinePlaySubScreen : OsuScreen, IOnlinePlaySubScr
|
|||
|
||||
public virtual string ShortTitle => Title;
|
||||
|
||||
[Resolved(CanBeNull = true)]
|
||||
protected IRoomManager RoomManager { get; private set; }
|
||||
[Resolved]
|
||||
protected IRoomManager? RoomManager { get; private set; }
|
||||
|
||||
protected OnlinePlaySubScreen()
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue