From 36e8e074c90f11480389560e3f019a161f82efbe Mon Sep 17 00:00:00 2001 From: gdkchan Date: Mon, 10 Dec 2018 22:58:52 -0200 Subject: Misc. CPU improvements (#519) * Fix and simplify TranslatorCache * Fix some assignment alignments, remove some unused usings * Changes to ILEmitter, separate it from ILEmitterCtx * Rename ILEmitter to ILMethodBuilder * Rename LdrLit and *_Fix opcodes * Revert TranslatorCache impl to the more performant one, fix a few issues with it * Allow EmitOpCode to be called even after everything has been emitted * Make Emit and AdvanceOpCode private, simplify it a bit now that it starts emiting from the entry point * Remove unneeded temp use * Add missing exit call on TestExclusive * Use better hash * Implement the == and != operators --- ChocolArm64/TranslatorCache.cs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'ChocolArm64/TranslatorCache.cs') diff --git a/ChocolArm64/TranslatorCache.cs b/ChocolArm64/TranslatorCache.cs index 7d650357..93da555e 100644 --- a/ChocolArm64/TranslatorCache.cs +++ b/ChocolArm64/TranslatorCache.cs @@ -9,8 +9,8 @@ namespace ChocolArm64 { class TranslatorCache { - //Maximum size of the cache, in bytes, measured in ARM code size. - private const int MaxTotalSize = 4 * 1024 * 256; + //Maximum size of the cache, the unit used is completely arbitrary. + private const int MaxTotalSize = 0x800000; //Minimum time required in milliseconds for a method to be eligible for deletion. private const int MinTimeDelta = 2 * 60000; @@ -63,10 +63,10 @@ namespace ChocolArm64 { ClearCacheIfNeeded(); - _totalSize += size; - lock (_sortedCache) { + _totalSize += size; + LinkedListNode node = _sortedCache.AddLast(position); CacheBucket newBucket = new CacheBucket(subroutine, node, size); @@ -98,11 +98,18 @@ namespace ChocolArm64 { try { - bucket.CallCount = 0; - - _sortedCache.Remove(bucket.Node); - - bucket.UpdateNode(_sortedCache.AddLast(position)); + //The bucket value on the dictionary may have changed between the + //time we get the value from the dictionary, and we acquire the + //lock. So we need to ensure we are working with the latest value, + //we can do that by getting the value again, inside the lock. + if (_cache.TryGetValue(position, out CacheBucket latestBucket)) + { + latestBucket.CallCount = 0; + + _sortedCache.Remove(latestBucket.Node); + + latestBucket.UpdateNode(_sortedCache.AddLast(position)); + } } finally { -- cgit v1.2.3