Android Camera Hal之線程模塊


 

CAMX線程模塊涉及的主要類: ThreadManager(管理者),JobRegistry(任務注冊),ThreadCore(核心)。數據存儲涉及的主要結構:JobList(任務鏈),JobQueue(優先級隊列,本質是數組)

通過JobRegistry將camx中其他模塊執行任務注冊到ThreadManager,ThreadManager通過ThreadCore處理camx模塊注冊的任務。ThreadCore通過系統線程接口進行多線程的實現。

模塊結構與組成

圖1-1 ThreadManager的JobList

ThreadManager將使用應用模塊的任務處理通過JobRegistry添加到JobList。

圖1-2 JobCore優先級隊列

JobCore作為線程管理模塊的核心處理單元,通過JobQueue即優先級隊列對任務進行處理。Job級別由JobPriority定義:Critical、High、Normal。高優先級的任務優先得到系統的處理。

模塊實現邏輯

  1. 初始化
  2. 注冊處理
  3. 提交任務
  4. 取消處理與注銷

初始化

 

圖2-1ThreadManager初始化

 

創建JobList和JobQueue,核心處理執行體並建立ThreadCore與成員關系。

JobList存儲ThreadManager管理的Job。JobRegistry通過RegisteredSlot標記一個注冊,如果Slot為true為注冊;RegisteredJob登記注冊的任務處理。RegisteredSlot和RegisteredJob通過index對應。ThreadCore通過調用系統接口創建多線程處理優先級隊列中的Job。

ThreadManager初始化階段主要是進行數據結構的構建。JobList用來記錄應用模塊提交的任務;JobRegistry對使用模塊注冊的任務處理進行管理,其成員RegisteredSlot為位圖標記結構,用於注冊標記;ThreadCore作為任務核心調用系統多線程接口完成任務的優先處理。

注冊處理

圖2-2 任務處理的注冊

step1:取可用Slot

step2:RegisteredJob中注冊單元完成注冊信息的填充

step3:更新RegisteredJob中注冊單元Flush狀態

提交任務

圖2-3 向ThreadManager提交任務

圖示以向ThreadManager提交一個Critical類型Job為例。

取消處理與注銷

注銷前對已注冊任務進行取消,即FlushJobFamily。Flush由Blocking和UnBlocking兩種方式。

圖2-4 取消任務時Flush處理

Flush由兩種方式:Blocking和UnBlocking。Blocking方式時需要step3/4等待Flush的結束

任務處理

與提交Job向對應,構成生產者&消費者模型。

 1.生產者消費者模型

 2.狀態機

三種狀態:NoFlush, FlushRequested, Flushed

DoWork   

未完待續

 

模塊接口

這里的接口指供外部模塊訪問的接口

1.創建一個Thread對象

Create   ThreadManager對象的創建
Destroy  ThreadManager對象銷毀

2.JobFamily任務組處理

RegisterJobFamily     注冊一個Job處理函數
UnregisterJobFamily
FlushJobFamily
ResumeJobFamily
GetJobCount    獲取提交的注冊Family的未完成runtime job數
GetInFlightCount 獲取當前正在執行的runtime job數

3.提交一個任務

PostJob        提交一個任務到對應的JobFamily              

4.調試

DumpStateToFile    dump job信息到文件
DumoStateToLog     dump job信息到日志輸出

 

模塊使用

1.創建ThreadManager對象:ThreadManager::Create

2.注冊Job處理    threadManager->RegisterJobFamily(JobFunc, JobFuncName, ..., JobHandle),JobFunc:處理函數指針;JobFuncName:JobFamily名稱;JobHandle:Job句柄,用於提交Job

3.提交Job           threadManager->PostJob(JobHandle, ..., isBlocking)    JobHandle:為RegisterJobFamily返回的JobHandle;isBlocking:表示該Thread是不是blocking執行

4.注銷Job           threadManager->UnregisterJobFamily(JobFunc, JobFuncName, JobHandle) 

5.銷毀ThreadManager對象:threadManager->Destroy

Camx有實際的應用可以參考,例如:DRQ


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM