aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/TranslatorCache.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-12-10 22:58:52 -0200
committerGitHub <noreply@github.com>2018-12-10 22:58:52 -0200
commit36e8e074c90f11480389560e3f019a161f82efbe (patch)
treea187c1702feba371ff9be1b71491efc3dfcf9ed8 /ChocolArm64/TranslatorCache.cs
parentf1529b1bc2bafbdadcf4d4643aa5716414097239 (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.cs25
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
{