Fix potential deadlock on nested context creation requests

This commit is contained in:
Dean Herbert 2021-11-29 16:18:57 +09:00
parent 54798eabc9
commit c98451a7bf

View File

@ -52,6 +52,8 @@ namespace osu.Game.Database
/// </summary>
private readonly SemaphoreSlim contextCreationLock = new SemaphoreSlim(1);
private bool canCreateContexts;
private static readonly GlobalStatistic<int> refreshes = GlobalStatistics.Get<int>(@"Realm", @"Dirty Refreshes");
private static readonly GlobalStatistic<int> contexts_created = GlobalStatistics.Get<int>(@"Realm", @"Contexts (Created)");
@ -153,7 +155,13 @@ namespace osu.Game.Database
try
{
contextCreationLock.Wait();
if (!canCreateContexts)
contextCreationLock.Wait();
// the semaphore is used to stop all context creation.
// once the semaphore has been taken by this code section, it is safe to create further contexts.
// this can happen if a realm subscription is active and triggers a callback which has user code that calls `CreateContext`.
canCreateContexts = true;
contexts_created.Value++;
@ -162,6 +170,7 @@ namespace osu.Game.Database
finally
{
contextCreationLock.Release();
canCreateContexts = false;
}
}