123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Text;
- using System.Threading;
- using Cysharp.Threading.Tasks.Internal;
- namespace Cysharp.Threading.Tasks
- {
- // public for add user custom.
- public static class TaskTracker
- {
- #if UNITY_EDITOR
- static int trackingId = 0;
- public const string EnableAutoReloadKey = "UniTaskTrackerWindow_EnableAutoReloadKey";
- public const string EnableTrackingKey = "UniTaskTrackerWindow_EnableTrackingKey";
- public const string EnableStackTraceKey = "UniTaskTrackerWindow_EnableStackTraceKey";
- public static class EditorEnableState
- {
- static bool enableAutoReload;
- public static bool EnableAutoReload
- {
- get { return enableAutoReload; }
- set
- {
- enableAutoReload = value;
- UnityEditor.EditorPrefs.SetBool(EnableAutoReloadKey, value);
- }
- }
- static bool enableTracking;
- public static bool EnableTracking
- {
- get { return enableTracking; }
- set
- {
- enableTracking = value;
- UnityEditor.EditorPrefs.SetBool(EnableTrackingKey, value);
- }
- }
- static bool enableStackTrace;
- public static bool EnableStackTrace
- {
- get { return enableStackTrace; }
- set
- {
- enableStackTrace = value;
- UnityEditor.EditorPrefs.SetBool(EnableStackTraceKey, value);
- }
- }
- }
- #endif
- static List<KeyValuePair<IUniTaskSource, (string formattedType, int trackingId, DateTime addTime, string stackTrace)>> listPool = new List<KeyValuePair<IUniTaskSource, (string formattedType, int trackingId, DateTime addTime, string stackTrace)>>();
- static readonly WeakDictionary<IUniTaskSource, (string formattedType, int trackingId, DateTime addTime, string stackTrace)> tracking = new WeakDictionary<IUniTaskSource, (string formattedType, int trackingId, DateTime addTime, string stackTrace)>();
- [Conditional("UNITY_EDITOR")]
- public static void TrackActiveTask(IUniTaskSource task, int skipFrame)
- {
- #if UNITY_EDITOR
- dirty = true;
- if (!EditorEnableState.EnableTracking) return;
- var stackTrace = EditorEnableState.EnableStackTrace ? new StackTrace(skipFrame, true).CleanupAsyncStackTrace() : "";
- string typeName;
- if (EditorEnableState.EnableStackTrace)
- {
- var sb = new StringBuilder();
- TypeBeautify(task.GetType(), sb);
- typeName = sb.ToString();
- }
- else
- {
- typeName = task.GetType().Name;
- }
- tracking.TryAdd(task, (typeName, Interlocked.Increment(ref trackingId), DateTime.UtcNow, stackTrace));
- #endif
- }
- [Conditional("UNITY_EDITOR")]
- public static void RemoveTracking(IUniTaskSource task)
- {
- #if UNITY_EDITOR
- dirty = true;
- if (!EditorEnableState.EnableTracking) return;
- var success = tracking.TryRemove(task);
- #endif
- }
- static bool dirty;
- public static bool CheckAndResetDirty()
- {
- var current = dirty;
- dirty = false;
- return current;
- }
- /// <summary>(trackingId, awaiterType, awaiterStatus, createdTime, stackTrace)</summary>
- public static void ForEachActiveTask(Action<int, string, UniTaskStatus, DateTime, string> action)
- {
- lock (listPool)
- {
- var count = tracking.ToList(ref listPool, clear: false);
- try
- {
- for (int i = 0; i < count; i++)
- {
- action(listPool[i].Value.trackingId, listPool[i].Value.formattedType, listPool[i].Key.UnsafeGetStatus(), listPool[i].Value.addTime, listPool[i].Value.stackTrace);
- listPool[i] = default;
- }
- }
- catch
- {
- listPool.Clear();
- throw;
- }
- }
- }
- static void TypeBeautify(Type type, StringBuilder sb)
- {
- if (type.IsNested)
- {
- // TypeBeautify(type.DeclaringType, sb);
- sb.Append(type.DeclaringType.Name.ToString());
- sb.Append(".");
- }
- if (type.IsGenericType)
- {
- var genericsStart = type.Name.IndexOf("`");
- if (genericsStart != -1)
- {
- sb.Append(type.Name.Substring(0, genericsStart));
- }
- else
- {
- sb.Append(type.Name);
- }
- sb.Append("<");
- var first = true;
- foreach (var item in type.GetGenericArguments())
- {
- if (!first)
- {
- sb.Append(", ");
- }
- first = false;
- TypeBeautify(item, sb);
- }
- sb.Append(">");
- }
- else
- {
- sb.Append(type.Name);
- }
- }
- //static string RemoveUniTaskNamespace(string str)
- //{
- // return str.Replace("Cysharp.Threading.Tasks.CompilerServices", "")
- // .Replace("Cysharp.Threading.Tasks.Linq", "")
- // .Replace("Cysharp.Threading.Tasks", "");
- //}
- }
- }
|