/********************************************************************************************************* ** 函数名称: wdg_delete ** 功能描述: 删除定时器. ** 输 入 : wdg_id 定时器句柄 ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API int wdg_delete (wdg_t wdg_id) { if (API_TimerDelete(&wdg_id)) { errno = EINVAL; return (PX_ERROR); } else { return (ERROR_NONE); } }
/********************************************************************************************************* ** 函数名称: __resPidReclaim ** 功能描述: 从资源管理器删除对应进程的全部资源 (需要等待所有进程内线程结束) ** 输 入 : pid 进程号 ** 输 出 : 是否成功, 如果不成功证明这个进程还有线程在运行. ** 全局变量: ** 调用模块: *********************************************************************************************************/ INT __resPidReclaim (pid_t pid) { INT i; PLW_RESOURCE_H presh; PLW_RESOURCE_RAW presraw; PLW_LIST_LINE plineTemp; if (pid == 0) { return (ERROR_NONE); /* 内核, 不执行回收操作 */ } __LW_RESRAW_LOCK(); plineTemp = _G_plineResRaw; while (plineTemp) { presraw = (PLW_RESOURCE_RAW)plineTemp; plineTemp = _list_line_get_next(plineTemp); if (presraw->RESRAW_pid == pid) { presraw->RESRAW_pfuncFree(presraw->RESRAW_pvArg[0], presraw->RESRAW_pvArg[1], presraw->RESRAW_pvArg[2], presraw->RESRAW_pvArg[3], presraw->RESRAW_pvArg[4], presraw->RESRAW_pvArg[5]); /* 释放原始资源 */ } } __LW_RESRAW_UNLOCK(); vprocIoReclaim(pid, LW_FALSE); /* 回收进程所有打开的文件 */ #if LW_CFG_VMM_EN > 0 API_VmmMmapReclaim(pid); #endif /* LW_CFG_VMM_EN > 0 */ for (i = 0; i < LW_CFG_MAX_THREAD_POOLS; i++) { presh = &_G_reshThreadPoolBuffer[i]; if ((presh->RESH_pid == pid) && !presh->RESH_bIsGlobal) { API_ThreadPoolDelete(&presh->RESH_ulHandle); } } for (i = 0; i < LW_CFG_MAX_EVENTS; i++) { /* 处理事件 */ presh = &_G_reshEventBuffer[i]; if ((presh->RESH_pid == pid) && !presh->RESH_bIsGlobal) { if (_ObjectGetClass(presh->RESH_ulHandle) == _OBJECT_MSGQUEUE) { API_MsgQueueDelete(&presh->RESH_ulHandle); } else { API_SemaphoreDelete(&presh->RESH_ulHandle); } } } for (i = 0; i < LW_CFG_MAX_EVENTSETS; i++) { /* 处理事件组 */ presh = &_G_reshEventsetBuffer[i]; if ((presh->RESH_pid == pid) && !presh->RESH_bIsGlobal) { API_EventSetDelete(&presh->RESH_ulHandle); } } for (i = 0; i < LW_CFG_MAX_TIMERS; i++) { /* 处理定时器 */ presh = &_G_reshTimerBuffer[i]; if ((presh->RESH_pid == pid) && !presh->RESH_bIsGlobal) { API_TimerDelete(&presh->RESH_ulHandle); } } for (i = 0; i < LW_CFG_MAX_RMSS; i++) { /* 处理 RMS */ presh = &_G_reshRmsBuffer[i]; if ((presh->RESH_pid == pid) && !presh->RESH_bIsGlobal) { API_RmsDeleteEx(&presh->RESH_ulHandle, LW_TRUE); } } for (i = 0; i < LW_CFG_MAX_PARTITIONS; i++) { /* 处理 PATITIONS */ presh = &_G_reshPartitionBuffer[i]; if ((presh->RESH_pid == pid) && !presh->RESH_bIsGlobal) { API_PartitionDeleteEx(&presh->RESH_ulHandle, LW_TRUE); } } for (i = 0; i < LW_CFG_MAX_REGIONS; i++) { /* 最后处理可变内存 */ presh = &_G_reshRegionBuffer[i]; if ((presh->RESH_pid == pid) && !presh->RESH_bIsGlobal) { API_RegionDeleteEx(&presh->RESH_ulHandle, LW_TRUE); } } return (ERROR_NONE); }