Merge pull request #11464 from peppy/fix-is-connected-thread-safety

Fix non-threadsafe usage of MultiplayerClient.IsConnected
This commit is contained in:
Dean Herbert 2021-01-15 14:10:02 +09:00 committed by GitHub
commit 9f77bb07c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 7 additions and 8 deletions

View File

@ -52,6 +52,7 @@ namespace osu.Game.Online.Multiplayer
/// <summary> /// <summary>
/// Whether the <see cref="StatefulMultiplayerClient"/> is currently connected. /// Whether the <see cref="StatefulMultiplayerClient"/> is currently connected.
/// This is NOT thread safe and usage should be scheduled.
/// </summary> /// </summary>
public abstract IBindable<bool> IsConnected { get; } public abstract IBindable<bool> IsConnected { get; }

View File

@ -34,8 +34,8 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
{ {
base.LoadComplete(); base.LoadComplete();
isConnected.BindValueChanged(_ => updateState()); isConnected.BindValueChanged(_ => Scheduler.AddOnce(updateState));
operationInProgress.BindValueChanged(_ => updateState(), true); operationInProgress.BindValueChanged(_ => Scheduler.AddOnce(updateState), true);
} }
private void updateState() => Enabled.Value = isConnected.Value && !operationInProgress.Value; private void updateState() => Enabled.Value = isConnected.Value && !operationInProgress.Value;

View File

@ -77,14 +77,14 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
}); });
isConnected = client.IsConnected.GetBoundCopy(); isConnected = client.IsConnected.GetBoundCopy();
isConnected.BindValueChanged(connected => isConnected.BindValueChanged(connected => Schedule(() =>
{ {
if (!connected.NewValue) if (!connected.NewValue)
{ {
// messaging to the user about this disconnect will be provided by the MultiplayerMatchSubScreen. // messaging to the user about this disconnect will be provided by the MultiplayerMatchSubScreen.
failAndBail(); failAndBail();
} }
}, true); }), true);
Debug.Assert(client.Room != null); Debug.Assert(client.Room != null);
} }

View File

@ -34,10 +34,8 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
base.LoadComplete(); base.LoadComplete();
isConnected.BindTo(multiplayerClient.IsConnected); isConnected.BindTo(multiplayerClient.IsConnected);
isConnected.BindValueChanged(_ => Schedule(updatePolling)); isConnected.BindValueChanged(_ => Scheduler.AddOnce(updatePolling));
JoinedRoom.BindValueChanged(_ => updatePolling()); JoinedRoom.BindValueChanged(_ => Scheduler.AddOnce(updatePolling), true);
updatePolling();
} }
public override void CreateRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null) public override void CreateRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null)