diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2018-12-10 22:58:52 -0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-12-10 22:58:52 -0200 |
| commit | 36e8e074c90f11480389560e3f019a161f82efbe (patch) | |
| tree | a187c1702feba371ff9be1b71491efc3dfcf9ed8 /ChocolArm64/TranslatorCache.cs | |
| parent | f1529b1bc2bafbdadcf4d4643aa5716414097239 (diff) | |
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
Diffstat (limited to 'ChocolArm64/TranslatorCache.cs')
| -rw-r--r-- | ChocolArm64/TranslatorCache.cs | 25 |
1 files changed, 16 insertions, 9 deletions
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<long> 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 { |
