(965c31410a) Unstable v0.10.4.0

This commit is contained in:
Juan Pablo Arce
2020-07-21 08:57:50 -03:00
parent 4f8bd39789
commit 33d3a41104
546 changed files with 45952 additions and 25762 deletions
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -7,8 +8,11 @@ namespace Barotrauma
{
public static class TaskPool
{
const int MaxTasks = 5000;
private struct TaskAction
{
public string Name;
public Task Task;
public Action<Task, object> OnCompletion;
public object UserData;
@@ -16,32 +20,41 @@ namespace Barotrauma
private static List<TaskAction> taskActions = new List<TaskAction>();
private static void AddInternal(Task task, Action<Task, object> onCompletion, object userdata)
public static void ListTasks(string[] args)
{
lock (taskActions)
{
taskActions.Add(new TaskAction() { Task = task, OnCompletion = onCompletion, UserData = userdata });
DebugConsole.NewMessage($"Task count: {taskActions.Count}");
for (int i=0;i<taskActions.Count;i++)
{
DebugConsole.NewMessage($" -{i}: {taskActions[i].Name}, {taskActions[i].Task.Status}");
}
}
}
public static void Add(Task task, Action<Task> onCompletion)
private static void AddInternal(string name, Task task, Action<Task, object> onCompletion, object userdata)
{
AddInternal(task, (Task t, object obj) => { onCompletion?.Invoke(t); }, null);
lock (taskActions)
{
if (taskActions.Count >= MaxTasks)
{
throw new Exception(
"Too many tasks in the TaskPool:\n" + string.Join('\n', taskActions.Select(ta => ta.Name))
);
}
taskActions.Add(new TaskAction() { Name = name, Task = task, OnCompletion = onCompletion, UserData = userdata });
DebugConsole.Log($"New task: {name} ({taskActions.Count}/{MaxTasks})");
}
}
public static void Add<U>(Task task, U userdata, Action<Task, U> onCompletion) where U : class
public static void Add(string name, Task task, Action<Task> onCompletion)
{
AddInternal(task, (Task t, object obj) => { onCompletion?.Invoke(t, (U)obj); }, userdata);
AddInternal(name, task, (Task t, object obj) => { onCompletion?.Invoke(t); }, null);
}
public static void Add<T>(Task<T> task, Action<Task<T>> onCompletion)
public static void Add<U>(string name, Task task, U userdata, Action<Task, U> onCompletion) where U : class
{
AddInternal(task, (Task t, object obj) => { onCompletion?.Invoke((Task<T>)t); }, null);
}
public static void Add<T,U>(Task<T> task, U userdata, Action<Task<T>, U> onCompletion) where U : class
{
AddInternal(task, (Task t, object obj) => { onCompletion?.Invoke((Task<T>)t, (U)obj); }, userdata);
AddInternal(name, task, (Task t, object obj) => { onCompletion?.Invoke(t, (U)obj); }, userdata);
}
public static void Update()
@@ -53,6 +66,7 @@ namespace Barotrauma
if (taskActions[i].Task.IsCompleted)
{
taskActions[i].OnCompletion?.Invoke(taskActions[i].Task, taskActions[i].UserData);
DebugConsole.Log($"Task {taskActions[i].Name} completed ({taskActions.Count-1}/{MaxTasks})");
taskActions.RemoveAt(i);
i--;
}