aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/ATranslatorCache.cs
diff options
context:
space:
mode:
authorAlex Barney <thealexbarney@gmail.com>2018-10-30 19:43:02 -0600
committergdkchan <gab.dark.100@gmail.com>2018-10-30 22:43:02 -0300
commit9cb57fb4bb3bbae0ae052a5af4a96a49fc5d864d (patch)
tree0c97425aeb311c142bc92a6fcc503cb2c07d4376 /ChocolArm64/ATranslatorCache.cs
parent5a87e58183578f5b84ca8d01cbb76aed11820f78 (diff)
Adjust naming conventions for Ryujinx and ChocolArm64 projects (#484)
* Change naming convention for Ryujinx project * Change naming convention for ChocolArm64 project * Fix NaN * Remove unneeded this. from Ryujinx project * Adjust naming from new PRs * Name changes based on feedback * How did this get removed? * Rebasing fix * Change FP enum case * Remove prefix from ChocolArm64 classes - Part 1 * Remove prefix from ChocolArm64 classes - Part 2 * Fix alignment from last commit's renaming * Rename namespaces * Rename stragglers * Fix alignment * Rename OpCode class * Missed a few * Adjust alignment
Diffstat (limited to 'ChocolArm64/ATranslatorCache.cs')
-rw-r--r--ChocolArm64/ATranslatorCache.cs165
1 files changed, 0 insertions, 165 deletions
diff --git a/ChocolArm64/ATranslatorCache.cs b/ChocolArm64/ATranslatorCache.cs
deleted file mode 100644
index 199b44f8..00000000
--- a/ChocolArm64/ATranslatorCache.cs
+++ /dev/null
@@ -1,165 +0,0 @@
-using System;
-using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-using System.Threading;
-
-namespace ChocolArm64
-{
- class ATranslatorCache
- {
- //Maximum size of the cache, in bytes, measured in ARM code size.
- private const int MaxTotalSize = 4 * 1024 * 256;
-
- //Minimum time required in milliseconds for a method to be eligible for deletion.
- private const int MinTimeDelta = 2 * 60000;
-
- //Minimum number of calls required to update the timestamp.
- private const int MinCallCountForUpdate = 250;
-
- private class CacheBucket
- {
- public ATranslatedSub Subroutine { get; private set; }
-
- public LinkedListNode<long> Node { get; private set; }
-
- public int CallCount { get; set; }
-
- public int Size { get; private set; }
-
- public long Timestamp { get; private set; }
-
- public CacheBucket(ATranslatedSub Subroutine, LinkedListNode<long> Node, int Size)
- {
- this.Subroutine = Subroutine;
- this.Size = Size;
-
- UpdateNode(Node);
- }
-
- public void UpdateNode(LinkedListNode<long> Node)
- {
- this.Node = Node;
-
- Timestamp = GetTimestamp();
- }
- }
-
- private ConcurrentDictionary<long, CacheBucket> Cache;
-
- private LinkedList<long> SortedCache;
-
- private int TotalSize;
-
- public ATranslatorCache()
- {
- Cache = new ConcurrentDictionary<long, CacheBucket>();
-
- SortedCache = new LinkedList<long>();
- }
-
- public void AddOrUpdate(long Position, ATranslatedSub Subroutine, int Size)
- {
- ClearCacheIfNeeded();
-
- TotalSize += Size;
-
- lock (SortedCache)
- {
- LinkedListNode<long> Node = SortedCache.AddLast(Position);
-
- CacheBucket NewBucket = new CacheBucket(Subroutine, Node, Size);
-
- Cache.AddOrUpdate(Position, NewBucket, (Key, Bucket) =>
- {
- TotalSize -= Bucket.Size;
-
- SortedCache.Remove(Bucket.Node);
-
- return NewBucket;
- });
- }
- }
-
- public bool HasSubroutine(long Position)
- {
- return Cache.ContainsKey(Position);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool TryGetSubroutine(long Position, out ATranslatedSub Subroutine)
- {
- if (Cache.TryGetValue(Position, out CacheBucket Bucket))
- {
- if (Bucket.CallCount++ > MinCallCountForUpdate)
- {
- if (Monitor.TryEnter(SortedCache))
- {
- try
- {
- Bucket.CallCount = 0;
-
- SortedCache.Remove(Bucket.Node);
-
- Bucket.UpdateNode(SortedCache.AddLast(Position));
- }
- finally
- {
- Monitor.Exit(SortedCache);
- }
- }
- }
-
- Subroutine = Bucket.Subroutine;
-
- return true;
- }
-
- Subroutine = default(ATranslatedSub);
-
- return false;
- }
-
- private void ClearCacheIfNeeded()
- {
- long Timestamp = GetTimestamp();
-
- while (TotalSize > MaxTotalSize)
- {
- lock (SortedCache)
- {
- LinkedListNode<long> Node = SortedCache.First;
-
- if (Node == null)
- {
- break;
- }
-
- CacheBucket Bucket = Cache[Node.Value];
-
- long TimeDelta = Timestamp - Bucket.Timestamp;
-
- if (TimeDelta <= MinTimeDelta)
- {
- break;
- }
-
- if (Cache.TryRemove(Node.Value, out Bucket))
- {
- TotalSize -= Bucket.Size;
-
- SortedCache.Remove(Bucket.Node);
- }
- }
- }
- }
-
- private static long GetTimestamp()
- {
- long timestamp = Stopwatch.GetTimestamp();
-
- return timestamp / (Stopwatch.Frequency / 1000);
- }
- }
-} \ No newline at end of file