ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年1月11日 星期三

android code trace : rild, service socket

  1. s_listen_event : processCommandsCallback, listenCallback,
  2. s_commands_event : listenCallback
  3. s_wakeupfd_event : eventLoop
  4. s_debug_event : RIL_register
其中 各 event 對應的 socket, callback function:
  1. s_listen_event : s_fdListen, listenCallback
  2. s_commands_event : s_fdCommand, processCommandsCallback
  3. s_wakeupfd_event : s_fdWakeupRead, processWakeupCallback
  4. s_debug_event : s_fdDebug, debugCallback
s_wakeupfd_event 是用 pipe implement,只是為讓 event loop 跳出 select( ) 的 blocking 狀態。
所以內容很無聊。
正如變數名稱所說:只是為了 wakeup event loop。

s_debug_event 提供 socket : SOCKET_NAME_RIL_DEBUG 供額外控制 ril 的介面。

s_listen_event 是 Rild 的主要 service socket : SOCKET_NAME_RIL。

這兩個 socket: #define SOCKET_NAME_RIL "rild" #define SOCKET_NAME_RIL_DEBUG "rild-debug" 都是在 init.rc 中 create 好:
socket rild stream 660 root radio socket rild-debug stream 660 radio system 所以在 rild 中只要經過 android_get_control_socket() 從環境變數中取出 socket id 就可以,不用自己 create (bind)。


rild 是一對多的 server,所有的 client 經過 SOCKET_RIL 向 rild 取得命令通道,之後就可以和 rild 溝通。

rild 從 s_fdListen 得到 client 的連線 (accept),就keep 這個 connection : s_command_event。
同時,繼續 s_fdListen 的 listen( ),等待另一個 client 的連線。
==> 一般 network server 的作法。

這個 socket base , event callback 的架構中心,就是 libril/ril_event.cpp 的 ril_event_loop().

ril_event_loop 是一個一般化的 event callback loop,就是select block,return if data available
然後call 對應的 callback。

沒有留言:

標籤

網誌存檔