基於fusion的DirectFB訊息流

李先靜發表於2020-04-06

在傳統的DirectFB應用中,所有的應用程式都在一個程式中,在效能上,有一些優勢,然而一個應用程式不穩定會造成整個系統的不穩定。若採用C/S模型,無疑是重蹈X Widnow的覆轍,會喪失效能上的優勢。

 

所以DirectFB採用了另外一種方式,與C/S相區別,稱之為主從模型(Master/Slave)。它加了一個稱之為fusion的核心模組。Fusion是熔化的意思,多個應用程式在不的程式空間裡,通過這個核心模組通訊,在這裡,一切都溶為一體了。Master應用程式負責初始化一個稱為竟技場的東西,其它Slave應用程式可以加入或者退出竟技場。當Master退出時,則其它所有Slave都必須退出。

 

Fusion裡採用了Reactor模式,每個應用程式可以通過ioctlreactor註冊事件處理器,當有事件發生時,reactor會把事件寫入到所註冊了的應用程式的fusion檔案描述符時,之後應用程式可以從fusion檔案描述符裡讀取到事件資料。

 

當然,應用程式也可以通過ioctl傳送事件給其它應用程式,reactor時會把事件分發給其它應用程式。

 

下面以觸控式螢幕為例介紹筆點事件的過程:

 

1.         初始化時,driver_open_device建立一個程式,掛在/dev/input/event0上,等待筆點事件。

 

2.         初始化時,應用程式建立另外一個執行緒,掛在/dev/fusionN(不同的應用程式N值不同)上。

 

3.         當有筆點事件時,通過函式呼叫dfb_input_dispatch-->fusion_reactor_dispatch->ioctl (FUSION_REACTOR_DISPATCH)把訊息丟給核心模組。

 

4.         核心模組中的Reactor把事件資料寫入到各個所註冊的事件處理器的/dev/fusionN裡。

 

5.         應用程式從/dev/fusionN檔案中取得事件資料,並呼叫應用程式內部的reactor處理函式,一般是IDirectFBEventBuffer_InputReact/IDirectFBEventBuffer_WindowReact兩個函式。

 

6.         然後,在IDirectFBEventBuffer_InputReact/IDirectFBEventBuffer_WindowReact兩個函式中,呼叫IDirectFBEventBuffer_AddItem把事件加入到視窗的事件佇列中。

 

7.         在應用程式的主執行緒中,就可以通過呼叫視窗的GetEvent函式從事件佇列中獲取事件了,最後,把獲取的事件分發到各個視窗事件處理函式中。

 

DirectFB的官方網站:http://www.directfb.org

相關文章