1
0
mirror of https://github.com/ppy/osu.git synced 2026-05-18 17:30:00 +08:00

Post disposal to synchronisation context

This commit is contained in:
Dean Herbert
2022-01-23 20:38:34 +09:00
Unverified
parent 0709a2ac9b
commit 5e7993c35a
+15 -5
View File
@@ -260,19 +260,29 @@ namespace osu.Game.Database
if (!ThreadSafety.IsUpdateThread)
throw new InvalidOperationException(@$"{nameof(Register)} must be called from the update thread.");
var syncContext = SynchronizationContext.Current;
registerSubscription(action);
// This token is returned to the consumer only.
// It will cause the registration to be permanently removed.
return new InvokeOnDisposal(() =>
{
lock (contextLock)
if (ThreadSafety.IsUpdateThread)
unsubscribe();
else
syncContext.Post(_ => unsubscribe(), null);
void unsubscribe()
{
if (customSubscriptionActions.TryGetValue(action, out var unsubscriptionAction))
lock (contextLock)
{
unsubscriptionAction?.Dispose();
customSubscriptionActions.Remove(action);
realmSubscriptionsResetMap.Remove(action);
if (customSubscriptionActions.TryGetValue(action, out var unsubscriptionAction))
{
unsubscriptionAction?.Dispose();
customSubscriptionActions.Remove(action);
realmSubscriptionsResetMap.Remove(action);
}
}
}
});