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
通过将单个字节写入唤醒管道来唤醒使用 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)

计时器完成播放

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() 时使用的应用状态对象的指针。

DispatchEvent 类

Error DispatchEvent(
  Event aEvent
)

此操作会分派指定的事件,以供此实例处理。

对事件类型和参数进行取消编组由特定于平台的钩子处理,然后钩子应回调至实际调度的 Layer::HandleEvent

详情
参数
[in] aEvent
要分派以进行处理的特定于平台的事件对象。
返回值
成功时为 WEAVE_SYSTEM_NO_ERROR;否则为指明初始化失败的原因的特定错误。

DispatchEvent 类

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 事件的实际调度和处理。

详情
参数
[in,out] aTarget
对事件所针对的图层对象的引用。
[in] aEventType
要处理的事件 / 消息类型。
[in] aArgument
与事件 / 消息关联的参数。
返回值
WEAVE_SYSTEM_NO_ERROR
成功时。
WEAVE_SYSTEM_ERROR_UNEXPECTED_STATE
如果 InetLayer 对象的状态不正确。
WEAVE_SYSTEM_ERROR_UNEXPECTED_EVENT
事件类型无法识别。

HandlePlatform 计时器

Error HandlePlatformTimer(
  void
)

处理平台计时器失效事件。

调用 nl::Weave::System::计时器::HandleExpired 计时器 以处理任何已过期的计时器。假设仅在拥有 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 处理函数。

详情
参数
[in] aSetSize
Select 调用的返回值。
[in] aReadSet
指向读取文件描述符集的指针。
[in] aWriteSet
指向写入文件描述符集合的指针。
[in] aExceptionSet
指向出错的文件描述符集的指针。

Init

Error Init(
  void *aContext
)

图层

 Layer(
  void
)

新计时器

Error NewTimer(
  Timer *& aTimerPtr
)

发布事件

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

这会将具有指定参数的指定类型事件 / 消息发布到此实例的平台专用事件队列。

详情
参数
[in,out] aTarget
指向发出 post 请求的 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 

这将返回层对象的当前状态。

唤醒选择器

void WakeSelect(
  void
)

通过将单个字节写入唤醒管道来唤醒使用 select() 监控文件描述符的 I/O 线程。

注意:如果从 HandleSelectResult() 中调用 WakeSelect(),则可以跳过对唤醒管道的写入操作,因为 I/O 线程已经唤醒。 此外,我们不在乎此写入是否失败,因为唯一合理的失败可能是管道已满,在这种情况下,选定的调用线程一定会被唤醒。

公共静态函数

GetClock_单调

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
)

以毫秒为单位,返回单调系统时间。

此函数会返回由平台定义的任意周期的已经历时间(以毫秒为单位)。返回的值保证在系统重新启动后会不断增加(即永不换行)。此外,在不需要在唤醒时重启的系统睡眠模式下,底层时间源将保证不间断运行。

虽然有些平台可能会选择返回用于测量系统启动后所经过的时间的值,但应用不得依赖此值。此外,GetClock_Monotonic() 的周期需要与任何其他 GetClock... 函数相同。因此,只能对同一函数返回的值执行相对时间计算。

该函数一定会在使用线程的任何平台上进行线程安全。

详情
返回值
自平台定义的任意周期以来经过的时间(以毫秒为单位)。

GetClock_RealTime

Error GetClock_RealTime(
  uint64_t & curTime
)

以微秒为单位的 Unix 时间格式返回当前实际(民用)时间。

此方法会返回当前实时平台的本地概念,表示为以微秒为单位的 Unix 时间值。底层时钟保证能够以至少整秒(1000000 的值)的频率执行抖动,但在某些平台上也可能会以更快的速度执行。

如果底层平台能够实时跟踪,但系统当前未同步,则 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
)

以毫秒(Unix 时间格式)返回当前实际(民用)时间。

此方法会返回本地实时平台的概念(表示为以毫秒表示的 Unix 时间值)。底层时钟保证能够以至少整秒(1000000 的值)的频率执行抖动,但在某些平台上也可能会以更快的速度执行。

如果底层平台能够实时跟踪,但系统当前未同步,则 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
平台无法实时跟踪的情况。

设置时钟

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
发出调用的应用没有设置当前时间的权限。