blob: 50afed070acbff2b9d12255b7ac92cce3e0c052f [file] [log] [blame]
@startuml
skinparam classFontSize 8
skinparam classFontName Helvetica
autonumber
participant "Application" as app
participant "User Callback" as callback
participant "Job" as job
participant "Task Pool public API" as TP
participant "Dispatch queue" as queue
participant "Worker Threads" as workers
box "Task Pool" #LightBlue
participant TP
participant queue
participant workers
end box
== Create Task Pool ==
activate app
app -[#blue]> TP: IotTaskPool_Create: create a Task
TP -> queue: Initialize dispatch queue
activate queue
TP -> workers: Create minimum number of worker threads
activate workers
TP --[#blue]> app
activate TP
workers -> workers: Wait on incoming jobs
== Use Task Pool ==
loop Application loop: Create and schedule jobs
app -[#blue]> TP: IotTaskPool_CreateRecyclableJob: create a job
TP --[#blue]> app
activate job
note left: job status: //ready//
app -[#blue]> TP: IotTaskPool_Schedule: schedule a job
TP -> queue: Queue job
TP -> TP: Grow pool up to maximum threads, if all threads are busy
TP -> workers: Signal incoming job
TP --[#blue]> app
note left: job status: //scheduled//
loop Outer dispatch loop: Wait on incoming jobs
workers -> queue: Dequeue next job
loop Inner dispatch loop: Execute any queue jobs in order
workers -[#green]> job: Invoke user callback
note left: job status: //executing//
job -[#green]> callback: Invoke
activate callback
callback -[#blue]> TP: IotTaskPool_RecycleJob: recycles job
TP --[#blue]> callback
note left: job status: //completed//
deactivate job
deactivate callback
workers -> workers: Move to next job
end
workers -> workers: Wait on incoming jobs
end
end
== Destroy Task Pool ==
app -[#blue]> TP: IotTaskPool_Destroy: destroy the task pool
TP -> workers: Shutdown worker threads
deactivate workers
TP -> queue: Destroy all jobs in the dispatch queue
deactivate queue
TP --[#blue]> app
deactivate TP
@enduml