diff --git a/EvenPerfectBitScanner/Program.cs b/EvenPerfectBitScanner/Program.cs index bc43a58..c888631 100644 --- a/EvenPerfectBitScanner/Program.cs +++ b/EvenPerfectBitScanner/Program.cs @@ -881,11 +881,7 @@ internal static class Program Span hitsSpan = default; int hitIndex = 0; int index; - bool useDivisorCycles = _byDivisorTester!.UseDivisorCycles; - DivisorCycleCache.Lease cycleLease = default; - ulong cycleLeaseStart = 0UL; - ulong cycleLeaseEnd = 0UL; - ulong[]? cycleValues = null; + bool useDivisorCycles = _byDivisorTester!.UseDivisorCycles; ulong divisorCycle = 0UL; try @@ -903,27 +899,9 @@ internal static class Program divisor = AcquireNextDivisor(ref nextDivisor, divisorLimit, ref divisorsExhaustedFlag, ref finalDivisorBits, out exhausted, ref localDivisorCursor, ref localDivisorsRemaining); if (divisor != 0UL) { - if (useDivisorCycles) - { - if (!cycleLease.IsValid || divisor < cycleLeaseStart || divisor > cycleLeaseEnd) - { - cycleLease.Dispose(); - cycleLease = DivisorCycleCache.Shared.Acquire(divisor); - cycleLeaseStart = cycleLease.Start; - cycleLeaseEnd = cycleLease.End; - cycleValues = cycleLease.Values ?? throw new InvalidOperationException("Divisor cycle cache returned no values for acquired lease."); - } - else if (cycleValues is null) - { - cycleValues = cycleLease.Values ?? throw new InvalidOperationException("Divisor cycle cache returned no values for acquired lease."); - } - - divisorCycle = cycleValues[(int)(divisor - cycleLeaseStart)]; - } - else - { - divisorCycle = 0UL; - } + divisorCycle = useDivisorCycles + ? DivisorCycleCache.Shared.Acquire(divisor).GetCycle(divisor) + : 0UL; activeCount = BuildPrimeBuffer(divisor, primeValues, allowedMaxValues, stateFlags, primeBuffer, indexBuffer, completionsBuffer, ref completionsCount, ref remainingStates, activeStateMask, ref activeStartIndex); @@ -1016,10 +994,9 @@ internal static class Program FlushPendingResults(compositesBuffer, ref compositesCount); } } - finally - { - cycleLease.Dispose(); - ArrayPool.Shared.Return(compositesBuffer, clearArray: true); + finally + { + ArrayPool.Shared.Return(compositesBuffer, clearArray: true); ArrayPool.Shared.Return(completionsBuffer, clearArray: true); ArrayPool.Shared.Return(indexBuffer, clearArray: true); ArrayPool.Shared.Return(primeBuffer, clearArray: true); diff --git a/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs b/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs index 92df4ca..376a2a7 100644 --- a/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs +++ b/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs @@ -171,8 +171,8 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv byte hit; if (useCycles) { - using DivisorCycleCache.Lease cycleLease = DivisorCycleCache.Shared.Acquire(divisor); - ulong divisorCycle = cycleLease.GetCycle(divisor); + DivisorCycleCache.CycleBlock cycleBlock = DivisorCycleCache.Shared.Acquire(divisor); + ulong divisorCycle = cycleBlock.GetCycle(divisor); hit = CheckDivisor(prime, divisorCycle != 0UL, divisorCycle, divisorData); } else