Move final result set firing to before the update realm is disposed

Without this, if any registered callback attempts to access
`RealmAccess.Realm` when handling the empty set callback, it will
deadlock the game.
This commit is contained in:
Dean Herbert 2022-01-26 15:57:05 +09:00
parent 5ea781faef
commit 24bcba6418
1 changed files with 8 additions and 10 deletions

View File

@ -604,20 +604,18 @@ public IDisposable BlockAllOperations()
Logger.Log(@"Blocking realm operations.", LoggingTarget.Database);
updateRealm?.Dispose();
updateRealm = null;
}
// In order to ensure events arrive in the correct order, these *must* be fired post disposal of the update realm,
// and must be posted to the synchronization context.
// This is because realm may fire event callbacks between the `unregisterAllSubscriptions` and `updateRealm.Dispose`
// calls above.
// Force a flush of any pending callbacks in the synchronization context.
// We want to ensure that the empty set callbacks are the last thing to arrive.
syncContext?.Send(_ =>
{
foreach (var action in notificationsResetMap.Values)
action();
}, null);
updateRealm?.Dispose();
updateRealm = null;
}
const int sleep_length = 200;
int timeout = 5000;