mirror of
https://github.com/ppy/osu
synced 2025-02-20 12:26:59 +00:00
Fix potential deadlock on nested context creation requests
This commit is contained in:
parent
54798eabc9
commit
c98451a7bf
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user