From 32056224d8e318d12ae0813fc4bf4c72c3d5e6a1 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 8 May 2023 15:53:09 +0100 Subject: [PATCH] fix: dispose observables and completion sources from Dispose method --- VpSharp/src/VirtualParadiseClient.cs | 75 ++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/VpSharp/src/VirtualParadiseClient.cs b/VpSharp/src/VirtualParadiseClient.cs index cf0300a..36f7b11 100644 --- a/VpSharp/src/VirtualParadiseClient.cs +++ b/VpSharp/src/VirtualParadiseClient.cs @@ -200,6 +200,13 @@ public sealed partial class VirtualParadiseClient : IDisposable { ReleaseUnmanagedResources(); GC.SuppressFinalize(this); + + DisposeCompletionSources(); + DisposeObservables(); + + _worlds.Clear(); + _avatars.Clear(); + _users.Clear(); } /// @@ -678,6 +685,74 @@ public sealed partial class VirtualParadiseClient : IDisposable return taskCompletionSource; } + private void DisposeCompletionSources() + { + _connectCompletionSource?.TrySetCanceled(); + _connectCompletionSource = null; + + _enterCompletionSource?.TrySetCanceled(); + _enterCompletionSource = null; + + _loginCompletionSource?.TrySetCanceled(); + _loginCompletionSource = null; + + _worldSettingsCompletionSource.TrySetCanceled(); + _worldSettingsCompletionSource = null!; + + foreach (KeyValuePair> pair in _inviteCompletionSources) + { + pair.Value.TrySetCanceled(); + } + + foreach (KeyValuePair> pair in _joinCompletionSources) + { + pair.Value.TrySetCanceled(); + } + + foreach (KeyValuePair> pair in _objectCompletionSources) + { + pair.Value.TrySetCanceled(); + } + + foreach (KeyValuePair> pair in _objectUpdates) + { + pair.Value.TrySetCanceled(); + } + + foreach (KeyValuePair> pair in _usersCompletionSources) + { + pair.Value.TrySetCanceled(); + } + + _joinCompletionSources.Clear(); + _inviteCompletionSources.Clear(); + _objectCompletionSources.Clear(); + _objectUpdates.Clear(); + _usersCompletionSources.Clear(); + } + + private void DisposeObservables() + { + _avatarClicked.Dispose(); + _avatarJoined.Dispose(); + _avatarLeft.Dispose(); + _avatarMoved.Dispose(); + _avatarTypeChanged.Dispose(); + + _objectBump.Dispose(); + _objectClicked.Dispose(); + _objectCreated.Dispose(); + _objectDeleted.Dispose(); + _objectUpdates.Clear(); + + _inviteRequestReceived.Dispose(); + _joinRequestReceived.Dispose(); + _teleported.Dispose(); + _uriReceived.Dispose(); + _universeServerDisconnected.Dispose(); + _worldServerDisconnected.Dispose(); + } + private void ReleaseUnmanagedResources() { _ = vp_destroy(NativeInstanceHandle);