OSAL 接口包含 RiCOSTask_endMyTask 方法,如果线程被自身删除(例如,如果活动的反应类进入终止连接符),那么将使用此方法。
但是,在某些 RTOS 中,不允许线程直接执行此类操作。RiCHandleCloser 类能够解决此问题。它是具有状态图的活动反应单实例类,并且该状态图只包含一种状态。此状态只接收一个事件 (CloseEVent),并且接收到该事件时只执行一项操作(doCloseHandle() 调用)。
OMHandleClose 线程在 OMOS::initEpilog() 中进行初始化:
void RiCOSOXFInitEpilog(void)
{
(void)RiCHandleCloser_startBehavior(RiCHandleCloser_Instance(RiCInt_doCloseH
andle));
}
如果某个线程即将退出,那么它将从框架中调用 endMyTask() 函数,该函数将向 HandleCloser 线程发送 CloseEvent message(event)。
void RiCOSTask_endMyTask( RiC_CONST_TYPE void *const hThread )
{
if( hThread != NULL )
{
RiCHandleCloser_genCloseEvent(hThread);
Exit( 0UL );
}
}
此消息包含所要删除的线程的句柄。
doCloseHandle 是静态函数,处理 CloseEvent 事件时,HandleCloser 线程将调用此函数。
您可以在 Integrity 适配器(Share/LangC/oxf/RiCOSIntegrity.c 文件)中找到 HandleCloser 的用法。