Skip to content

Commit 1b43af6

Browse files
committed
don't remove reserved states!
1 parent 0a5d16b commit 1b43af6

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

src/BizHawk.Client.Common/tools/TAStudio/PagedStateManager.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,10 @@ private int FreePage(int frame)
363363
_midPagesUsed += pages;
364364
_midStates.Add(stateToKick);
365365
}
366+
else if (_reserveCallback(stateToKick.Frame))
367+
{
368+
// Recategorize as old. Nothing to do here.
369+
}
366370
else
367371
{
368372
_states.Remove(stateToKick);
@@ -382,7 +386,7 @@ private int FreePage(int frame)
382386
StateInfo stateToKick = oldestNewerState.Frame != 0 ? oldestNewerState : _midStates.Min;
383387

384388
// Kicking a state means checking if it belongs in old.
385-
bool recategorizeAsOld = ShouldKeepForOld(stateToKick.Frame);
389+
bool recategorizeAsOld = ShouldKeepForOld(stateToKick.Frame) || _reserveCallback(stateToKick.Frame);
386390
int pages = (stateToKick.Size + PAGE_DATA_SIZE - 1) / PAGE_DATA_SIZE;
387391
_midPagesUsed -= pages;
388392
_midStates.Remove(stateToKick);

src/BizHawk.Tests/Client.Common/Movie/PagedStateManagerTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,28 @@ public void CanHandleLargeBuffer()
473473
Assert.AreEqual(expectedStates, manager.Count);
474474
}
475475

476+
[TestMethod]
477+
public void KeepsReservedFrames()
478+
{
479+
const int reservedFrame1 = 7;
480+
int reservedFrame2 = 0;
481+
482+
IStatable ss = CreateStateSource();
483+
PagedStateManager manager = new(MakeDefaultSettings(), (f) => f == reservedFrame1 || f == reservedFrame2);
484+
manager.Engage(ss.CloneSavestate());
485+
486+
for (int i = 0; i < PAGE_COUNT; i++)
487+
manager.Capture(i, ss);
488+
489+
// Reserve a frame after capture
490+
reservedFrame2 = 13;
491+
for (int i = PAGE_COUNT; i < PAGE_COUNT * 2; i++)
492+
manager.Capture(i, ss);
493+
494+
Assert.IsTrue(manager.HasState(reservedFrame1));
495+
Assert.IsTrue(manager.HasState(reservedFrame2));
496+
}
497+
476498
private class StateSource : IStatable
477499
{
478500
public int Frame { get; set; }

0 commit comments

Comments
 (0)