1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-22 03:27:24 +08:00

Fix track stores being kept alive

This commit is contained in:
smoogipoo 2020-08-06 17:48:07 +09:00
parent c72ab9047e
commit f53672193e
2 changed files with 24 additions and 2 deletions

View File

@ -219,6 +219,7 @@ namespace osu.Game.Beatmaps
}
private readonly WeakList<BeatmapManagerWorkingBeatmap> workingCache = new WeakList<BeatmapManagerWorkingBeatmap>();
private readonly Dictionary<ITrackStore, int> referencedTrackStores = new Dictionary<ITrackStore, int>();
/// <summary>
/// Retrieve a <see cref="WorkingBeatmap"/> instance for the provided <see cref="BeatmapInfo"/>
@ -257,12 +258,25 @@ namespace osu.Game.Beatmaps
textureStore ??= new LargeTextureStore(host?.CreateTextureLoaderStore(Files.Store));
trackStore ??= audioManager.GetTrackStore(Files.Store);
workingCache.Add(working = new BeatmapManagerWorkingBeatmap(Files.Store, textureStore, trackStore, beatmapInfo, audioManager));
workingCache.Add(working = new BeatmapManagerWorkingBeatmap(Files.Store, textureStore, trackStore, beatmapInfo, audioManager, dereferenceTrackStore));
referencedTrackStores[trackStore] = referencedTrackStores.GetOrDefault(trackStore) + 1;
return working;
}
}
private void dereferenceTrackStore(ITrackStore trackStore)
{
lock (workingCache)
{
if (--referencedTrackStores[trackStore] == 0)
{
referencedTrackStores.Remove(trackStore);
trackStore.Dispose();
}
}
}
/// <summary>
/// Perform a lookup query on available <see cref="BeatmapSetInfo"/>s.
/// </summary>

View File

@ -23,11 +23,14 @@ namespace osu.Game.Beatmaps
public readonly ITrackStore TrackStore;
private readonly IResourceStore<byte[]> store;
private readonly Action<ITrackStore> dereferenceAction;
public BeatmapManagerWorkingBeatmap(IResourceStore<byte[]> store, TextureStore textureStore, ITrackStore trackStore, BeatmapInfo beatmapInfo, AudioManager audioManager)
public BeatmapManagerWorkingBeatmap(IResourceStore<byte[]> store, TextureStore textureStore, ITrackStore trackStore, BeatmapInfo beatmapInfo, AudioManager audioManager,
Action<ITrackStore> dereferenceAction)
: base(beatmapInfo, audioManager)
{
this.store = store;
this.dereferenceAction = dereferenceAction;
TextureStore = textureStore;
TrackStore = trackStore;
@ -137,6 +140,11 @@ namespace osu.Game.Beatmaps
return null;
}
}
~BeatmapManagerWorkingBeatmap()
{
dereferenceAction?.Invoke(TrackStore);
}
}
}
}