diff --git a/ARMeilleure/Translation/JitCache.cs b/ARMeilleure/Translation/JitCache.cs index ad54598792..b3410d97e2 100644 --- a/ARMeilleure/Translation/JitCache.cs +++ b/ARMeilleure/Translation/JitCache.cs @@ -19,7 +19,7 @@ namespace ARMeilleure.Translation private static JitCacheMemoryAllocator _allocator; - private static List _cacheEntries; + private static Dictionary _cacheEntries; private static object _lock; @@ -41,7 +41,7 @@ namespace ARMeilleure.Translation _allocator = new JitCacheMemoryAllocator(CacheSize, startOffset); - _cacheEntries = new List(); + _cacheEntries = new Dictionary(); _lock = new object(); } @@ -101,7 +101,7 @@ namespace ARMeilleure.Translation { if (TryFind((int)offset, out JitCacheEntry entry)) { - _cacheEntries.Remove(entry); + _cacheEntries.Remove((int)offset, out entry); int size = checked(entry.Size + (CodeAlignment - 1)) & ~(CodeAlignment - 1); @@ -112,23 +112,16 @@ namespace ARMeilleure.Translation private static void Add(JitCacheEntry entry) { - _cacheEntries.Add(entry); + _cacheEntries.Add(entry.Offset, entry); } public static bool TryFind(int offset, out JitCacheEntry entry) { lock (_lock) { - foreach (JitCacheEntry cacheEntry in _cacheEntries) + if(_cacheEntries.TryGetValue(offset, out entry)) { - int endOffset = cacheEntry.Offset + cacheEntry.Size; - - if (offset >= cacheEntry.Offset && offset < endOffset) - { - entry = cacheEntry; - - return true; - } + return true; } } diff --git a/ARMeilleure/Translation/Translator.cs b/ARMeilleure/Translation/Translator.cs index 6d19320136..380e35ca8a 100644 --- a/ARMeilleure/Translation/Translator.cs +++ b/ARMeilleure/Translation/Translator.cs @@ -57,19 +57,24 @@ namespace ARMeilleure.Translation return func; }); } - else if (_oldFunctions.TryDequeue(out TranslatedFunction function)) - { - if (Interlocked.CompareExchange(ref function.EntryCount, -1, 0) != 0) - { - _oldFunctions.Enqueue(function); - } - else - { - JitCache.Free(function.Pointer); - } - } else { + Queue skippedFunctions = new Queue(); + + while (_oldFunctions.TryDequeue(out TranslatedFunction function)) + { + if (Interlocked.CompareExchange(ref function.EntryCount, -1, 0) != 0) + { + skippedFunctions.Enqueue(function); + } + else + { + JitCache.Free(function.Pointer); + } + } + + _oldFunctions = skippedFunctions; + _backgroundTranslatorEvent.WaitOne(); } }