Improved task cleanup

This commit is contained in:
Alessandro Proto 2023-03-16 20:10:50 +01:00
parent a84aedbe38
commit 9abb828dbd

View file

@ -65,8 +65,18 @@ public class TaskMeta : IComponent
var container = tasks.NewThread(); var container = tasks.NewThread();
lk(container); lk(container);
container.XMove(tasks, 1); container.XMove(tasks, 1);
tasks.Replace(-2); tasks.Remove(-2);
DataIndex = tasks.GetTop(); var emptySpot = FindSpot();
if (emptySpot > -1)
{
tasks.Replace(emptySpot);
DataIndex = emptySpot;
}
else
{
DataIndex = tasks.GetTop();
}
_game.LuaRuntime.QueueEvent("task_finish", LK => _game.LuaRuntime.QueueEvent("task_finish", LK =>
{ {
@ -179,7 +189,7 @@ public class TaskMeta : IComponent
public static RuntimeTask Push(Lua L, string typeName) public static RuntimeTask Push(Lua L, string typeName)
{ {
if(!tasks.CheckStack(1)) if (!tasks.CheckStack(1))
{ {
L.Error("tasks limit exceeded"); L.Error("tasks limit exceeded");
} }
@ -208,6 +218,34 @@ public class TaskMeta : IComponent
return obj; return obj;
} }
private static int FindSpot()
{
var top = tasks.GetTop();
for (int i = 1; i <= top; i++)
{
if (tasks.IsNil(i))
return i;
}
return -1;
}
private static void GCTasks()
{
var top = tasks.GetTop();
int peak = 0;
for (int i = top; i > 0; i--)
{
if (!tasks.IsNil(i))
{
peak = i;
break;
}
}
tasks.SetTop(peak);
}
private static void WaitForTask(Lua L) private static void WaitForTask(Lua L)
{ {
L.PushCFunction(Libraries.Event.L_Pull); L.PushCFunction(Libraries.Event.L_Pull);
@ -339,15 +377,14 @@ public class TaskMeta : IComponent
if (task is null) if (task is null)
return 0; return 0;
// todo: add cleanup to remove nil values at top of stack if (task.DataIndex >= 0)
if (tasks.GetTop() == task.DataIndex)
tasks.SetTop(task.DataIndex - 1);
else
{ {
tasks.PushNil(); tasks.PushNil();
tasks.Replace(task.DataIndex); tasks.Replace(task.DataIndex);
} }
GCTasks();
return 0; return 0;
} }