| @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 |