From f2b37e1fe725ea3e6c1a2cae2011ac3145007766 Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Sat, 5 Nov 2016 20:01:46 +0800 Subject: [PATCH 1/2] Add lock on each property of WorkingBeatmap. --- osu.Game/Beatmaps/WorkingBeatmap.cs | 66 +++++++++++++++++------------ 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/osu.Game/Beatmaps/WorkingBeatmap.cs b/osu.Game/Beatmaps/WorkingBeatmap.cs index 07e88af517..a94511ca2e 100644 --- a/osu.Game/Beatmaps/WorkingBeatmap.cs +++ b/osu.Game/Beatmaps/WorkingBeatmap.cs @@ -21,60 +21,72 @@ namespace osu.Game.Beatmaps private ArchiveReader reader => database.GetReader(BeatmapSetInfo); private Texture background; + private object backgroundLock = new object(); public Texture Background { get { - if (background != null) return background; - - try + lock (backgroundLock) { - background = new TextureStore(new RawTextureLoaderStore(reader)).Get(BeatmapInfo.Metadata.BackgroundFile); - } - catch { } + if (background != null) return background; - return background; + try + { + background = new TextureStore(new RawTextureLoaderStore(reader)).Get(BeatmapInfo.Metadata.BackgroundFile); + } + catch { } + + return background; + } } - set { background = value; } + set { lock (backgroundLock) background = value; } } private Beatmap beatmap; + private object beatmapLock; public Beatmap Beatmap { get { - if (beatmap != null) return beatmap; - - try + lock (beatmapLock) { - using (var stream = new StreamReader(reader.GetStream(BeatmapInfo.Path))) - beatmap = BeatmapDecoder.GetDecoder(stream)?.Decode(stream); - } - catch { } + if (beatmap != null) return beatmap; - return beatmap; + try + { + using (var stream = new StreamReader(reader.GetStream(BeatmapInfo.Path))) + beatmap = BeatmapDecoder.GetDecoder(stream)?.Decode(stream); + } + catch { } + + return beatmap; + } } - set { beatmap = value; } + set { lock (beatmapLock) beatmap = value; } } private AudioTrack track; + private object trackLock = new object(); public AudioTrack Track { get { - if (track != null) return track; - - try + lock (trackLock) { - var trackData = reader.GetStream(BeatmapInfo.Metadata.AudioFile); - if (trackData != null) - track = new AudioTrackBass(trackData); - } - catch { } + if (track != null) return track; - return track; + try + { + var trackData = reader.GetStream(BeatmapInfo.Metadata.AudioFile); + if (trackData != null) + track = new AudioTrackBass(trackData); + } + catch { } + + return track; + } } - set { track = value; } + set { lock (trackLock) track = value; } } public WorkingBeatmap(Beatmap beatmap) From e69dac774519e57a12dd25c6e82b14e51d5fc29d Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Sat, 5 Nov 2016 20:21:08 +0800 Subject: [PATCH 2/2] Fix lock object. --- osu.Game/Beatmaps/WorkingBeatmap.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Beatmaps/WorkingBeatmap.cs b/osu.Game/Beatmaps/WorkingBeatmap.cs index a94511ca2e..417e289b65 100644 --- a/osu.Game/Beatmaps/WorkingBeatmap.cs +++ b/osu.Game/Beatmaps/WorkingBeatmap.cs @@ -43,7 +43,7 @@ namespace osu.Game.Beatmaps } private Beatmap beatmap; - private object beatmapLock; + private object beatmapLock = new object(); public Beatmap Beatmap { get