From 63b533f15cda25a713ce833c7c5f05c056e1f542 Mon Sep 17 00:00:00 2001 From: goyuken Date: Sun, 24 Aug 2014 21:53:48 +0000 Subject: [PATCH] tasstatemanager: fix out of memory on save --- .../movie/tasproj/TasMovie.IO.cs | 4 +- .../movie/tasproj/TasStateManager.cs | 53 +++++++------------ 2 files changed, 22 insertions(+), 35 deletions(-) diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs index 77f7e67b3c..3f4ec30565 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs @@ -32,7 +32,7 @@ namespace BizHawk.Client.Common bs.PutLump(BinaryStateLump.GreenzoneSettings, tw => tw.WriteLine(StateManager.Settings.ToString())); if (StateManager.Settings.SaveGreenzone) { - bs.PutLump(BinaryStateLump.Greenzone, (BinaryWriter bw) => bw.Write(StateManager.ToArray())); + bs.PutLump(BinaryStateLump.Greenzone, (BinaryWriter bw) => StateManager.Save(bw)); } bs.PutLump(BinaryStateLump.LagLog, (BinaryWriter bw) => bw.Write(LagLog.ToByteArray())); @@ -159,7 +159,7 @@ namespace BizHawk.Client.Common { bl.GetLump(BinaryStateLump.Greenzone, false, delegate(BinaryReader br, long length) { - StateManager.FromArray(br.ReadBytes((int)length)); + StateManager.Load(br); }); } diff --git a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs index fe294764e3..bd15c705a5 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs @@ -103,51 +103,38 @@ namespace BizHawk.Client.Common Used = 0; } - public byte[] ToArray() + public void Save(BinaryWriter bw) { - MemoryStream ms = new MemoryStream(); - var bytes = BitConverter.GetBytes(States.Count); - ms.Write(bytes, 0, bytes.Length); + bw.Write(States.Count); foreach (var kvp in States) { - var frame = BitConverter.GetBytes(kvp.Key); - ms.Write(frame, 0, frame.Length); - - var stateLen = BitConverter.GetBytes(kvp.Value.Length); - ms.Write(stateLen, 0, stateLen.Length); - ms.Write(kvp.Value, 0, kvp.Value.Length); + bw.Write(kvp.Key); + bw.Write(kvp.Value.Length); + bw.Write(kvp.Value); } - - return ms.ToArray(); } + public void Load(BinaryReader br) + { + // ARE WE SUPPOSED TO CLEAR FIRST??? + int nstates = br.ReadInt32(); + for (int i = 0; i < nstates; i++) + { + int frame = br.ReadInt32(); + int len = br.ReadInt32(); + byte[] data = br.ReadBytes(len); + States.Add(frame, data); + Used += len; + } + } + + // Map: // 4 bytes - total savestate count //[Foreach state] // 4 bytes - frame // 4 bytes - length of savestate // 0 - n savestate - public void FromArray(byte[] bytes) - { - var position = 0; - var stateCount = BitConverter.ToInt32(bytes, 0); - position += 4; - for (int i = 0; i < stateCount; i++) - { - var frame = BitConverter.ToInt32(bytes, position); - position += 4; - var stateLen = BitConverter.ToInt32(bytes, position); - position += 4; - var state = bytes - .Skip(position) - .Take(stateLen) - .ToArray(); - - position += stateLen; - States.Add(frame, state); - Used += state.Length; - } - } private int Used {