nl::Weave::系統::圖層

#include <src/system/SystemLayer.h>

This provides access to timers according to the configured event handling model.

摘要

如果是 WEAVE_SYSTEM_CONFIG_USE_SOCKETS,系統會透過平台調整功能中的傳統意見調查/選取實作來處理事件準備通知。

針對 WEAVE_SYSTEM_CONFIG_USE_LWIP,事件準備通知會透過事件/訊息以及平台/系統專用掛鉤來處理事件/訊息系統。

建構函式和解構程式

Layer(void)

公開類型

EventHandler)(Object &aTarget, EventType aEventType, uintptr_t aArgument) typedef
Error(*
TimerCompleteFunct)(Layer *aLayer, void *aAppState, Error aError) typedef
void(*

公開函式

AddEventHandlerDelegate(LwIPEventHandlerDelegate & aDelegate)
Error
這樣會將事件處理常式委派新增至系統層,以延長其處理 LwIP 事件的能力。
CancelTimer(TimerCompleteFunct aOnComplete, void *aAppState)
void
這個方法會取消一次一次性的畫面,從 StartTimer()起提早開始。
DispatchEvent(Event aEvent)
Error
這會分派指定事件以處理這個執行個體。
DispatchEvents(void)
Error
這是適用於特定平台掛鉤的語法包裝函式,可影響事件迴圈、等待為這個執行個體提供服務的佇列、將佇列從該佇列中提取,然後再分派以處理。
GetPlatformData(void) const
void *
這會傳回任何指派給執行個體的用戶端專屬平台資料 (如果先前已設定)。
HandleEvent(Object & aTarget, EventType aEventType, uintptr_t aArgument)
Error
這樣可以執行分派和處理 Weave System Layer 事件。
HandlePlatformTimer(void)
Error
處理平台計時器到期事件。
HandleSelectResult(int aSetSize, fd_set *aReadSet, fd_set *aWriteSet, fd_set *aExceptionSet)
void
處理選取呼叫的 I/O。
Init(void *aContext)
Error
NewTimer(Timer *& aTimerPtr)
Error
PostEvent(Object & aTarget, EventType aEventType, uintptr_t aArgument)
Error
這會將指定類型的事件 / 訊息,使用所提供的引數張貼至這個執行個體的平台專屬事件佇列。
PrepareSelect(int & aSetSize, fd_set *aReadSet, fd_set *aWriteSet, fd_set *aExceptionSet, struct timeval & aSleepTime)
void
準備一組檔案描述元,讓 select() 能使用。
ScheduleWork(TimerCompleteFunct aComplete, void *aAppState)
Error
排定簽章為 TimerCompleteFunct 的函式,以便迅速在 Weave 執行緒上執行。
SetPlatformData(void *aPlatformData)
void
這會將指定的用戶端專屬平台資料設為執行個體,以供日後平台擷取。
Shutdown(void)
Error
StartTimer(uint32_t aMilliseconds, TimerCompleteFunct aComplete, void *aAppState)
Error
這個方法會啟動一次性計時器。
State(void) const
LayerState
這會傳回圖層物件的目前狀態。
WakeSelect(void)
void
將單一位元組寫入到直流管中,透過使用() 來監控監控描述元的 I/O 執行緒。

公開的靜態函式

GetClock_Monotonic(void)
uint64_t
以單秒為單位傳回單聲道系統時間。
GetClock_MonotonicHiRes(void)
uint64_t
傳回 (可能) 高解析度的單聲道系統時間,單位為毫秒。
GetClock_MonotonicMS(void)
uint64_t
傳回單聲道系統時間,單位為毫秒。
GetClock_RealTime(uint64_t & curTime)
Error
傳回目前實際的 (民用) 時間 (以微秒的 Unix 時間格式)。
GetClock_RealTimeMS(uint64_t & curTimeMS)
Error
傳回目前實際的 (民用) 時間,以毫秒 (Unx) 時間格式表示。
SetClock_RealTime(uint64_t newCurTime)
Error
設定平台目前 (民用) 時間的概念。

公開類型

EventHandler

Error(* EventHandler)(Object &aTarget, EventType aEventType, uintptr_t aArgument)

TimerCompleteFunct

void(* TimerCompleteFunct)(Layer *aLayer, void *aAppState, Error aError)

公開函式

新增事件處理常式委派

Error AddEventHandlerDelegate(
  LwIPEventHandlerDelegate & aDelegate
)

這樣會將事件處理常式委派新增至系統層,以延長其處理 LwIP 事件的能力。

詳情
參數
[in] aDelegate
非預期的 LwIP 事件處理常式委派結構
傳回值
WEAVE_SYSTEM_NO_ERROR
成功。
WEAVE_SYSTEM_ERROR_BAD_ARGS
如果 aDelegate 中包含的函式指標為 NULL

取消計時器

void CancelTimer(
  TimerCompleteFunct aOnComplete,
  void *aAppState
)

這個方法會取消一次一次性的畫面,從 StartTimer()起提早開始。

詳情
參數
[in] aOnComplete
指向 StartTimer() 用來呼叫回呼函式的指標。
[in] aAppState
指向 StartTimer() 呼叫的應用程式狀態物件的指標。

修補事件

Error DispatchEvent(
  Event aEvent
)

這會分派指定事件以處理這個執行個體。

事件的類型和引數取消拆解時,由平台專用的掛鉤處理,然後才會傳回 Layer::HandlingEvent 做為實際分派。

詳情
參數
[in] aEvent
要分派的平台專屬事件物件。
傳回
WEAVE_SYSTEM_NO_ERROR 成功;否則,表示發生初始化失敗的特定錯誤。

修補事件

Error DispatchEvents(
  void
)

這是適用於特定平台掛鉤的語法包裝函式,可影響事件迴圈、等待為這個執行個體提供服務的佇列、將佇列從該佇列中提取,然後再分派以處理。

詳情
傳回
WEAVE_SYSTEM_NO_ERROR 代表成功,否則會顯示特定錯誤,說明初始化失敗的原因。

取得平台資料

void * GetPlatformData(
  void
) const 

這會傳回任何指派給執行個體的用戶端專屬平台資料 (如果先前已設定)。

詳情
傳回
用戶端專屬平台資料 (如果先前已設定),否則為 NULL。

處理事件

Error HandleEvent(
  Object & aTarget,
  EventType aEventType,
  uintptr_t aArgument
)

這樣可以執行分派和處理 Weave System Layer 事件。

詳情
參數
[in,out] aTarget
目標為事件的圖層物件參照。
[in] aEventType
要處理的事件 / 訊息類型。
[in] aArgument
與事件 / 訊息相關的引數。
傳回值
WEAVE_SYSTEM_NO_ERROR
成功。
WEAVE_SYSTEM_ERROR_UNEXPECTED_STATE
如果 InetLayer 物件的狀態不正確。
WEAVE_SYSTEM_ERROR_UNEXPECTED_EVENT
如果無法辨識活動類型。

處理常式平台計時器

Error HandlePlatformTimer(
  void
)

處理平台計時器到期事件。

呼叫 nl::Weave::System::Timer::HandlingInvalidTimers 來處理任何過期的計時器。我們假設這個 API 只會在擁有 Weave System Layer 物件的執行緒上呼叫。

詳情
傳回
WEAVE_SYSTEM_NO_ERROR 作業成功,否則傳回錯誤代碼。

帳號選取結果

void HandleSelectResult(
  int aSetSize,
  fd_set *aReadSet,
  fd_set *aWriteSet,
  fd_set *aExceptionSet
)

處理選取呼叫的 I/O。

此方法會在每個有效端點註冊待處理的 I/O 事件,然後叫用這些端點的個別 I/O 處理函式。

詳情
參數
[in] aSetSize
所選呼叫的傳回值。
[in] aReadSet
指向讀取檔案描述元組合的指標。
[in] aWriteSet
指向寫入檔案描述元組合的指標。
[in] aExceptionSet
指向一組含有錯誤的檔案描述元組合。

Init

Error Init(
  void *aContext
)

Layer (圖層)

 Layer(
  void
)

新計時器

Error NewTimer(
  Timer *& aTimerPtr
)

後事件

Error PostEvent(
  Object & aTarget,
  EventType aEventType,
  uintptr_t aArgument
)

這會將指定類型的事件 / 訊息,使用所提供的引數張貼至這個執行個體的平台專屬事件佇列。

詳情
參數
[in,out] aTarget
發出訊息要求的 Weave System Layer 物件。
[in] aEventType
要張貼的活動類型。
[in,out] aArgument
與要張貼事件相關聯的引數。
傳回值
WEAVE_SYSTEM_NO_ERROR
成功。
WEAVE_SYSTEM_ERROR_UNEXPECTED_STATE
如果 Layer 物件的狀態不正確。
WEAVE_SYSTEM_ERROR_NO_MEMORY
如果事件佇列已滿。
other
已產生平台專屬錯誤,指出發生失敗的原因。

準備選取

void PrepareSelect(
  int & aSetSize,
  fd_set *aReadSet,
  fd_set *aWriteSet,
  fd_set *aExceptionSet,
  struct timeval & aSleepTime
)

準備一組檔案描述元,讓 select() 能使用。

詳情
參數
[out] aSetSize
檔案描述元集中的檔案描述元範圍。
[in] aReadSet
指向一組可讀取檔案描述元組合的指標。
[in] aWriteSet
指向可寫入檔案描述元集的指標。
[in] aExceptionSet
指向一組含有錯誤的檔案描述元組合。
[in] aSleepTime
參照最長睡眠時間。

排程工作

Error ScheduleWork(
  TimerCompleteFunct aComplete,
  void *aAppState
)

排定簽章為 TimerCompleteFunct 的函式,以便迅速在 Weave 執行緒上執行。

詳情
參數
[in] aComplete
這個計時器啟動時呼叫回呼函式的指標。
[in] aAppState
要傳送至回呼函式的應用程式指標物件的指標。
傳回值
WEAVE_SYSTEM_ERROR_UNEXPECTED_STATE
如果 SystemLayer 尚未初始化,
WEAVE_SYSTEM_ERROR_NO_MEMORY
如果 SystemLayer 無法分配新的計時器,
WEAVE_SYSTEM_NO_ERROR
成功。

設定平台資料

void SetPlatformData(
  void *aPlatformData
)

這會將指定的用戶端專屬平台資料設為執行個體,以供日後平台擷取。

詳情
參數
[in] aPlatformData
要設定的用戶端專屬平台資料。

停用

Error Shutdown(
  void
)

開始計時器

Error StartTimer(
  uint32_t aMilliseconds,
  TimerCompleteFunct aComplete,
  void *aAppState
)

這個方法會啟動一次性計時器。

詳情
參數
[in] aMilliseconds
到期時間,以毫秒為單位。
[in] aComplete
計時器時呼叫的函式指標。
[in] aAppState
計時器到期時,所使用的應用程式狀態物件的指標。
傳回
WEAVE_SYSTEM_NO_ERROR 成功。
傳回
WEAVE_SYSTEM_ERROR_NO_MEMORY 系統無法分配計時器的時間。
傳回
其他值表示計時器無法啟動。

狀態

LayerState State(
  void
) const 

這會傳回圖層物件的目前狀態。

WakeSelect

void WakeSelect(
  void
)

將單一位元組寫入到直流管中,透過使用() 來監控監控描述元的 I/O 執行緒。

注意:如果在 HandleSelectResult() 中呼叫 WakeSelect(),由於能略過 I/O 執行緒,因此可略過寫入直立線圖。 另外,由於寫入失敗是唯一的合理狀況是管道已滿,因此選擇的呼叫執行緒仍會喚醒,因此我們不會謹慎處理。

公開的靜態函式

GetClock_Monotonic (北卡羅萊納州)

uint64_t GetClock_Monotonic(
  void
)

以單秒為單位傳回單聲道系統時間。

這個函式會傳回任意時間 (以微秒為單位),因為這是由平台定義的紀元 (自系統定義) 起算。系統傳回的值保證會持續在系統重新啟動後增加 (亦即永遠不包裝)。此外,即使系統醒來時,基礎時間來源仍可在系統不固定的情況下重新啟動,並保證能夠持續運作。

雖然有些平台可能會選擇傳回用於評估系統啟動時間的值,但應用程式「不得」使用這個值。此外,GetClock_Monotonic() 的訓練週期「不得」與任何其他 GetClock 函式相同。因此,您只能針對同一個函式傳回的值執行相對時間的計算。

無論在何種平台上,只要保證所有執行緒都具備這個函式,這個函式就能確保執行緒安全。

詳情
傳回
自平台定義的暫時紀元,以微秒為單位。

GetClock_MonotonicHiRes

uint64_t GetClock_MonotonicHiRes(
  void
)

傳回 (可能) 高解析度的單聲道系統時間,單位為毫秒。

這個函式會傳回任意時間 (以微秒為單位),因為這是由平台定義的紀元 (自系統定義) 起算。系統傳回的值保證會持續在系統重新啟動後增加 (亦即永遠不包裝)。不過,即使系統進入休眠狀態,你「不會」在設定連續計時器的時間。

某些平台可以使用比 GetClock_Monotonic() 具有更高的精度定時器執行 GetClock_MonotonicHiRes() ,而且不受執行時間調整(剪切)。沒有這類計時器的系統,只需傳回與 GetClock_Monotonic() 相同的值即可。

GetClock_MonotonicHiRes() 傳回的時序不需要與任何其他 GetClock 函式相同,包括 GetClock_Monotonic()

無論在何種平台上,只要保證所有執行緒都具備這個函式,這個函式就能確保執行緒安全。

詳情
傳回
自平台定義的暫時紀元,以微秒為單位。

GetClock_MonotonicMS

uint64_t GetClock_MonotonicMS(
  void
)

傳回單聲道系統時間,單位為毫秒。

這個函式會傳回一個時間,以毫秒為單位,從任意的平台定義的 Epoch 紀元時間起算。系統傳回的值保證會持續在系統重新啟動後增加 (亦即永遠不包裝)。此外,即使系統醒來時,基礎時間來源仍可在系統不固定的情況下重新啟動,並保證能夠持續運作。

雖然有些平台可能會選擇傳回用於評估系統啟動時間的值,但應用程式「不得」使用這個值。此外,GetClock_Monotonic() 的訓練週期「不得」與任何其他 GetClock 函式相同。因此,您只能針對同一個函式傳回的值執行相對時間的計算。

無論在何種平台上,只要保證所有執行緒都具備這個函式,這個函式就能確保執行緒安全。

詳情
傳回
自平台定義的紀元時間起算,以毫秒為單位。

GetClock_RealTime

Error GetClock_RealTime(
  uint64_t & curTime
)

傳回目前實際的 (民用) 時間 (以微秒的 Unix 時間格式)。

此方法會傳回目前平台的即時概念,以調整至微秒的 Unix 時間值表示。保護基本時間以至少整整秒(值 1,000,000)的速度衝擊,但在某些平台上可能更快。

如果基礎平台能夠即時追蹤,但系統目前並未同步處理,GetClock_RealTime() 會傳回 WEAVE_SYSTEM_ERROR_REAL_TIME_NOT_SYNCED 錯誤。

在無法即時追蹤的平台上,GetClock_RealTime() 方法可能不存在,且會參照所有參照該連結的應用程式。或者,這類平台可能會提供 GetClock_RealTime() 的實作,系統一律會傳回 WEAVE_SYSTEM_ERROR_NOT_SUPPORTED 錯誤。

無論在何種平台上,只要保證所有執行緒都具備這個函式,這個函式就能確保執行緒安全。

詳情
參數
[out] curTime
目前時間,以 Unix 時間表示為微秒。
傳回值
WEAVE_SYSTEM_NO_ERROR
如果方法成功執行。
#WEAVE_SYSTEM_ERROR_REAL_TIME_NOT_SYNCED
如果平台能夠即時追蹤,但目前未同步處理。
#WEAVE_SYSTEM_ERROR_NOT_SUPPORTED
如果平台無法即時追蹤,

GetClock_RealTimeMS

Error GetClock_RealTimeMS(
  uint64_t & curTimeMS
)

傳回目前實際的 (民用) 時間,以毫秒 (Unx) 時間格式表示。

此方法會傳回目前平台的即時概念,以調整為毫秒的 Unix 時間值表示。保護基本時間以至少整整秒(值 1,000,000)的速度衝擊,但在某些平台上可能更快。

如果基礎平台能夠即時追蹤,但系統目前並未同步處理,GetClock_RealTimeMS() 會傳回 WEAVE_SYSTEM_ERROR_REAL_TIME_NOT_SYNCED 錯誤。

在無法即時追蹤的平台上,GetClock_RealTimeMS() 方法可能不存在,且會參照所有參照該連結的應用程式。或者,這類平台可能會提供 GetClock_RealTimeMS() 的實作,系統一律會傳回 WEAVE_SYSTEM_ERROR_NOT_SUPPORTED 錯誤。

無論在何種平台上,只要保證所有執行緒都具備這個函式,這個函式就能確保執行緒安全。

詳情
參數
[out] curTime
目前時間 (以 Unix 時間表示,以毫秒為單位)。
傳回值
WEAVE_SYSTEM_NO_ERROR
如果方法成功執行。
#WEAVE_SYSTEM_ERROR_REAL_TIME_NOT_SYNCED
如果平台能夠即時追蹤,但目前未同步處理。
#WEAVE_SYSTEM_ERROR_NOT_SUPPORTED
如果平台無法即時追蹤,

SetClock_RealTime

Error SetClock_RealTime(
  uint64_t newCurTime
)

設定平台目前 (民用) 時間的概念。

應用程式可以呼叫此函式來設定本機平台的即時概念。新的目前時間以 Unix 時間值表示 (以微秒為單位)。

設定之後,基本平台時鐘一定會即時追蹤,而且精細度至少為一秒。

有些平台可能會限制哪些應用程式或程序可以即時設定。如果呼叫者無法變更即時狀態,SetClock_RealTime() 函式會傳回 WEAVE_SYSTEM_ERROR_ACCESS_DENIED 錯誤。

在無法即時追蹤平台,或未提供設定即時功能的功能中,缺少 SetClock_RealTime() 函式,因此任何參照該函式的應用程式都會發生連結錯誤。或者,這類平台可能會提供 SetClock_RealTime() 的實作,該方法一律會傳回 WEAVE_SYSTEM_ERROR_NOT_SUPPORTED 錯誤。

無論在何種平台上,只要保證所有執行緒都具備這個函式,這個函式就能確保執行緒安全。

詳情
參數
[in] newCurTime
新的目前時間,以 Unix 時間表示為微秒。
傳回值
WEAVE_SYSTEM_NO_ERROR
如果方法成功執行。
#WEAVE_SYSTEM_ERROR_NOT_SUPPORTED
如果平台無法即時追蹤,
#WEAVE_SYSTEM_ERROR_ACCESS_DENIED
如果通話應用程式沒有設定目前時間的權限,