Skip to content

Commit

Permalink
Merge pull request #414 from georgejecook/track-task-usage
Browse files Browse the repository at this point in the history
Track task usage
  • Loading branch information
rdaci23 committed Nov 7, 2023
2 parents 1f1ed3e + 4ea15de commit 328cfb9
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 4 deletions.
48 changes: 47 additions & 1 deletion src/source/core/Tasks.bs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ namespace mc.tasks
' * @returns {node|invalid} task, or invalid it could not be created
' */
function createTask(taskType as string, fields as mc.types.assocarray, callback = invalid as function, isRunning = true as boolean, sendMode = "value" as string, scope = invalid as object, fieldName = "output" as string)

globalObj = mc.getGlobal()
task = mc.createSGNode(taskType)

if task = invalid
Expand All @@ -112,6 +112,10 @@ namespace mc.tasks
mc.tasks.observeNodeField(task, fieldName, callback, sendMode, true, scope)
end if

if asBoolean(globalObj.maestroConfig.isTrackingTaskUsage)
mc.tasks.observeNodeField(task, "state", mc.tasks.onTaskStateChange, "both")
end if

if isRunning
task.control = "RUN"
end if
Expand Down Expand Up @@ -364,6 +368,48 @@ namespace mc.tasks
end if
end function

function onTaskStateChange(state as string, task as mc.types.node)
isRunning = state = "run"
wasRunning = asBoolean(task._mIsRunning) = true
if not wasRunning and state = "run"
mc.setOrAddNodeField(task, "_mIsRunning", true)
else if wasRunning and state = "stop" or state = "done"
mc.setOrAddNodeField(task, "_mIsRunning", false)
end if

if isRunning = wasRunning
return invalid
end if

globalObj = mc.getGlobal()
taskType = task.subType()
isLoggingTasks = asBoolean(globalObj.maestroConfig.isLoggingTaskTracking)

maestroTasks = globalObj._maestroTasks
if maestroTasks = invalid
maestroTasks = mc.createSGNode("Node")
mc.setOrAddNodeField(globalObj, "_maestroTasks", maestroTasks)
end if
isRunning = isRunning = true ? 1 : 0
numberRunning = asInteger(maestroTasks[taskType]) + isRunning ? 1 : 0

if numberRunning > 0
mc.setOrAddNodeField(maestroTasks, taskType, numberRunning)
else
maestroTasks.removeField(taskType)
end if

if isLoggingTasks
fields = maestroTasks.getFields()
for each field in fields.items()
if not mc.isInteger(field.value)
fields.delete(field.key)
end if
end for
end if
return invalid
end function

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'++ ValueObserver class
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Expand Down
55 changes: 53 additions & 2 deletions src/source/core/Tasks.spec.bs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ namespace tests
super.beforeEach()
'bs:disable-next-line
tests.setNodeLogger()
m.global.removeField("_maestroTasks")
end function

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Expand Down Expand Up @@ -76,6 +77,58 @@ namespace tests
m.assertEqual(t.control, "run")
end function

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@describe("onTaskStateChange")
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

@it("does nothing if task is already running")
function _()
task = { "id": "task", _mIsRunning: true }
_maestroTasks = mc.createSGNode("Node")
mc.setOrAddNodeField(m.global, "_maestroTasks", _maestroTasks)

m.expectNotCalled(task.subType)
mc.tasks.onTaskStateChange("run", task)
end function

@it("sets track usage when state is run")
function _()
task = { "id": "task" }
m.expectCalled(task.subType(), "mc_RequestTask")

mc.tasks.onTaskStateChange("run", task)
m.assertEqual(m.global._maestroTasks["mc_RequestTask"], 1)
end function

@it("update tracking usage count when state is done or stop")
@params("done")
@params("stop")
function _(state)
task = { "id": "task", _mIsRunning: true }
_maestroTasks = mc.createSGNode("Node")
mc.setOrAddNodeField(_maestroTasks, "mc_RequestTask", 2)
mc.setOrAddNodeField(m.global, "_maestroTasks", _maestroTasks)

m.expectCalled(task.subType(), "mc_RequestTask")

mc.tasks.onTaskStateChange(state, task)
m.assertEqual(m.global._maestroTasks["mc_RequestTask"], 1)
end function

@it("removes entries from _maestroTasks if there are no more entries and state is done or stop")
@params("done")
@params("stop")
function _(state)
task = { "id": "task", _mIsRunning: true }
_maestroTasks = mc.createSGNode("Node")
mc.setOrAddNodeField(_maestroTasks, "mc_RequestTask", 0)
mc.setOrAddNodeField(m.global, "_maestroTasks", _maestroTasks)

m.expectCalled(task.subType(), "mc_RequestTask")

mc.tasks.onTaskStateChange(state, task)
m.assertInvalid(m.global._maestroTasks["mc_RequestTask"])
end function

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@describe("waitAFrame")
Expand All @@ -93,10 +146,8 @@ namespace tests
m.assertEqual(`${timer.duration}`, `${duration}`)
m.assertEqual(timer.control, "start")
m.assertTrue(timer.isFrameTimer)

end function


'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'++ utils
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Expand Down
1 change: 0 additions & 1 deletion src/source/view/FontManager.spec.bs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import "pkg:/source/tests/ViewBaseTestSuite.spec.bs"
import "pkg:/source/view/FontManager.bs"

namespace tests
@only
@suite("FontManager tests")
class FontManagerTests extends mv.tests.BaseTestSuite

Expand Down

0 comments on commit 328cfb9

Please sign in to comment.