nl:: Weave:: System:: Layer
#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)
|
typedefError(*
|
TimerCompleteFunct)(Layer *aLayer, void *aAppState, Error aError)
|
typedefvoid(*
|
公共函数 |
|
---|---|
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
通过向唤醒管道写入一个字节来唤醒使用 select() 监控文件描述符的 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
以毫秒 Unix 时间格式返回当前实际(民用)时间。
|
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)
公共函数
AddEventHandlerDelegate
Error AddEventHandlerDelegate( LwIPEventHandlerDelegate & aDelegate )
这会向系统层添加事件处理脚本委托,以扩展其处理 LwIP 事件的能力。
具体说明 | |||||
---|---|---|---|---|---|
参数 |
|
||||
返回值 |
|
CancelTimer
void CancelTimer( TimerCompleteFunct aOnComplete, void *aAppState )
此方法会取消一个通过 StartTimer()
提前启动的一次性计时器。
具体说明 | |||||
---|---|---|---|---|---|
参数 |
|
DispatchEvent
Error DispatchEvent( Event aEvent )
此操作会分派指定的事件以供此实例处理。
事件中的类型和参数的解组由特定于平台的钩子处理,然后该钩子应回调至 Layer::HandleEvent 以进行实际调度。
具体说明 | |||
---|---|---|---|
参数 |
|
||
返回值 |
如果成功,则为 WEAVE_SYSTEM_NO_ERROR;否则为说明初始化失败原因的特定错误。
|
DispatchEvents
Error DispatchEvents( void )
这是一个语法封装容器,用于封装特定于平台的钩子,钩子会影响事件循环,等待为此实例提供服务的队列,从该队列中拉取事件,然后分派这些事件进行处理。
具体说明 | |
---|---|
返回值 |
如果成功,则为 WEAVE_SYSTEM_NO_ERROR;否则,是一个具体错误,会说明初始化失败的原因。
|
GetPlatformData
void * GetPlatformData( void ) const
如果之前已设置此实例,此方法将返回分配给该实例的任何特定于客户端的平台数据。
具体说明 | |
---|---|
返回值 |
客户端特定的平台数据,如果之前已设置 ,则为 ;否则为 NULL。
|
HandleEvent
Error HandleEvent( Object & aTarget, EventType aEventType, uintptr_t aArgument )
这样会实现 Weave System Layer 事件的实际调度和处理。
具体说明 | |||||||
---|---|---|---|---|---|---|---|
参数 |
|
||||||
返回值 |
|
HandlePlatformTimer
Error HandlePlatformTimer( void )
处理平台计时器到期事件。
调用 nl::Weave::System::Timer::HandleExpiredTimers 来处理任何过期的计时器。系统假定只有在拥有 Weave System Layer 对象的线程上才会调用此 API。
具体说明 | |
---|---|
返回值 |
如果成功,则为 WEAVE_SYSTEM_NO_ERROR;否则为错误代码。
|
HandleSelectResult
void HandleSelectResult( int aSetSize, fd_set *aReadSet, fd_set *aWriteSet, fd_set *aExceptionSet )
处理来自选定调用的 I/O。
此方法会在每个活跃端点中注册待处理的 I/O 事件,然后针对这些端点调用相应的 I/O 处理函数。
具体说明 | |||||||||
---|---|---|---|---|---|---|---|---|---|
参数 |
|
Init
Error Init( void *aContext )
图层
Layer( void )
NewTimer
Error NewTimer( Timer *& aTimerPtr )
PostEvent
Error PostEvent( Object & aTarget, EventType aEventType, uintptr_t aArgument )
这将使用提供的参数将指定类型的事件 / 消息发布到该实例的平台专用事件队列中。
具体说明 | |||||||||
---|---|---|---|---|---|---|---|---|---|
参数 |
|
||||||||
返回值 |
|
PrepareSelect
void PrepareSelect( int & aSetSize, fd_set *aReadSet, fd_set *aWriteSet, fd_set *aExceptionSet, struct timeval & aSleepTime )
准备一组供 select()
使用的文件描述符。
具体说明 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
参数 |
|
ScheduleWork
Error ScheduleWork( TimerCompleteFunct aComplete, void *aAppState )
安排一个签名与 TimerCompleteFunct
相同的函数尽快在 Weave 线程上运行。
具体说明 | |||||||
---|---|---|---|---|---|---|---|
参数 |
|
||||||
返回值 |
|
SetPlatformData
void SetPlatformData( void *aPlatformData )
这会将指定的客户端专用平台数据设置为实例,以供客户端平台日后检索。
具体说明 | |||
---|---|---|---|
参数 |
|
关停
Error Shutdown( void )
StartTimer
Error StartTimer( uint32_t aMilliseconds, TimerCompleteFunct aComplete, void *aAppState )
此方法会启动单次计时器。
具体说明 | |||||||
---|---|---|---|---|---|---|---|
参数 |
|
||||||
返回值 |
WEAVE_SYSTEM_NO_ERROR;成功时。
|
||||||
返回值 |
WEAVE_SYSTEM_ERROR_NO_MEMORY 如果无法分配计时器。
|
||||||
返回值 |
表示计时器无法启动的其他值。
|
状态
LayerState State( void ) const
该方法用于返回图层对象的当前状态。
WakeSelect
void WakeSelect( void )
通过向唤醒管道写入一个字节来唤醒使用 select() 监控文件描述符的 I/O 线程。
注意:如果从 HandleSelectResult()
内调用 WakeSelect()
,则可以跳过对唤醒管道执行写入操作,因为 I/O 线程已处于唤醒状态。此外,我们并不关心此写入是否失败,因为唯一可能出现的失败情况是管道已满,在这种情况下,选定调用线程仍然会唤醒。
公共静态函数
GetClock_Monotonic
uint64_t GetClock_Monotonic( void )
返回单调系统时间(以微秒为单位)。
此函数返回自平台定义的任意纪元以来经过的时间(以微秒为单位)。在两次系统重新启动之间,返回的值一定会不断增加(即从不换行)。此外,在任何无需在唤醒时重启的系统休眠模式中,底层时间源会保证持续计时。
尽管某些平台可能会选择返回一个值来衡量系统启动后经过的时间,但应用不得依赖于此值。此外,GetClock_Monotonic() 的周期无需与任何其他 GetClock... 函数的周期相同。因此,只能针对由同一函数返回的值执行相对时间计算。
可以保证此函数在任何使用线程处理的平台上是线程安全的。
具体说明 | |
---|---|
返回值 |
自平台定义的任意纪元以来经过的时间(以微秒为单位)。
|
GetClock_MonotonicHiRes
uint64_t GetClock_MonotonicHiRes( void )
返回(可能)高分辨率单调系统时间(以微秒为单位)。
此函数返回自平台定义的任意纪元以来经过的时间(以微秒为单位)。在两次系统重新启动之间,返回的值一定会不断增加(即从不换行)。不过,底层计时器不需要在系统深度睡眠状态下连续计时。
某些平台可能会使用高分辨率计时器实现 GetClock_MonotonicHiRes(),该计时器比 GetClock_Monotonic() 的精度更高,并且不受时钟逐步调整(旋转)的影响。没有此类计时器的系统可能直接返回与 GetClock_Monotonic() 相同的值。
GetClock_MonotonicHiRes() 返回的时间的周期无需与任何其他 GetClock... 函数(包括 GetClock_Monotonic())的周期相同。
可以保证此函数在任何使用线程处理的平台上是线程安全的。
具体说明 | |
---|---|
返回值 |
自平台定义的任意纪元以来经过的时间(以微秒为单位)。
|
GetClock_MonotonicMS
uint64_t GetClock_MonotonicMS( void )
返回单调系统时间(以毫秒为单位)。
此函数返回自平台定义的任意纪元以来经过的时间(以毫秒为单位)。在两次系统重新启动之间,返回的值一定会不断增加(即从不换行)。此外,在任何无需在唤醒时重启的系统休眠模式中,底层时间源会保证持续计时。
尽管某些平台可能会选择返回一个值来衡量系统启动后经过的时间,但应用不得依赖于此值。此外,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。
可以保证此函数在任何使用线程处理的平台上是线程安全的。
具体说明 | |||||||
---|---|---|---|---|---|---|---|
参数 |
|
||||||
返回值 |
|
GetClock_RealTimeMS
Error GetClock_RealTimeMS( uint64_t & curTimeMS )
以毫秒 Unix 时间格式返回当前实际(民用)时间。
此方法返回本地平台的当前实时概念,表示为经过调整到毫秒的 Unix 时间值。底层时钟保证以至少整秒的速度(值为 1,000,000)进行计时,但在某些平台上可能会更快计时。
如果底层平台能够进行实时跟踪,但系统当前未同步,GetClock_RealTimeMS() 将返回错误 WEAVE_SYSTEM_ERROR_REAL_TIME_NOT_SYNCED。
在无法实时跟踪的平台上,可能不会出现 GetClock_RealTimeMS() 方法,从而导致引用该方法的任何应用出现链接错误。或者,此类平台可能会提供 GetClock_RealTimeMS() 的实现,始终返回错误 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。
可以保证此函数在任何使用线程处理的平台上是线程安全的。
具体说明 | |||||||
---|---|---|---|---|---|---|---|
参数 |
|
||||||
返回值 |
|