/********************************************************************************************************* ** 函数名称: __selPtyAdd ** 功能描述: 向指定的 pty wake up list 添加一个等待节点. (ioctl FIOSELECT 使用) ** 输 入 : p_ptyddev Ty 虚拟设备控制块 lArg select wake up node 控制结构 ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID __selPtyAdd (P_PTY_D_DEV p_ptyddev, LONG lArg) { REGISTER TY_DEV_ID ptyDev; REGISTER PLW_SEL_WAKEUPNODE pselwunNode = (PLW_SEL_WAKEUPNODE)lArg; REGISTER P_PTY_H_DEV p_ptyhdev = (P_PTY_H_DEV)_LIST_ENTRY(p_ptyddev, PTY_DEV, PTYDEV_ptyddev); /* 获得 HOST 端口 */ ptyDev = &p_ptyhdev->PTYHDEV_tydevTyDev; SEL_WAKE_NODE_ADD(&p_ptyddev->PTYDDEV_selwulList, pselwunNode); /* 添加节点 */ switch (pselwunNode->SELWUN_seltypType) { case SELREAD: /* 等待数据可读 */ if ((rngNBytes(ptyDev->TYDEV_vxringidWrBuf) > 0) || (ptyDev->TYDEV_tydevwrstat.TYDEVWRSTAT_bCR)) { SEL_WAKE_UP(pselwunNode); /* 检测主机是否有数据需要发送 */ } else { ptyDev->TYDEV_tydevwrstat.TYDEVWRSTAT_bBusy = LW_FALSE; /* 确保可以被 Startup 激活 */ } break; case SELWRITE: /* 等待数据可写 */ if (rngFreeBytes(ptyDev->TYDEV_vxringidRdBuf) > 0) { /* 检测主机接收缓存是否有空间 */ SEL_WAKE_UP(pselwunNode); /* 唤醒节点 */ } break; case SELEXCEPT: /* 等待设备异常 */ if ((LW_DEV_GET_USE_COUNT(&p_ptyddev->PTYDDEV_devhdrDevice) == 0) || (LW_DEV_GET_USE_COUNT(&p_ptyhdev->PTYHDEV_tydevTyDev.TYDEV_devhdrHdr) == 0)) { /* 设备关闭了 */ SEL_WAKE_UP(pselwunNode); /* 唤醒节点 */ } break; } }
/********************************************************************************************************* ** 函数名称: API_PipeDevDelete ** 功能描述: 删除一个管道设备 ** 输 入 : ** pcName 管道名称 ** bForce 强制删除 ** 输 出 : ERROR ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT API_PipeDevDelete (PCHAR pcName, BOOL bForce) { REGISTER PLW_PIPE_DEV p_pipedev; PCHAR pcTail = LW_NULL; if (LW_CPU_GET_CUR_NESTING()) { _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n"); _ErrorHandle(ERROR_KERNEL_IN_ISR); return (PX_ERROR); } if (_G_iPipeDrvNum <= 0) { _DebugHandle(__ERRORMESSAGE_LEVEL, "no driver.\r\n"); _ErrorHandle(ERROR_IO_NO_DRIVER); return (PX_ERROR); } p_pipedev = (PLW_PIPE_DEV)iosDevFind(pcName, &pcTail); if ((p_pipedev == LW_NULL) || (pcName == pcTail)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "device not found.\r\n"); _ErrorHandle(ERROR_IOS_DEVICE_NOT_FOUND); return (PX_ERROR); } if (bForce == LW_FALSE) { if (LW_DEV_GET_USE_COUNT(&p_pipedev->PIPEDEV_devhdrHdr)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "too many open files.\r\n"); _ErrorHandle(EBUSY); return (PX_ERROR); } if (SEL_WAKE_UP_LIST_LEN(&p_pipedev->PIPEDEV_selwulList) > 0) { errno = EBUSY; return (PX_ERROR); } } iosDevFileAbnormal(&p_pipedev->PIPEDEV_devhdrHdr); iosDevDelete(&p_pipedev->PIPEDEV_devhdrHdr); SEL_WAKE_UP_LIST_TERM(&p_pipedev->PIPEDEV_selwulList); API_SemaphoreBDelete(&p_pipedev->PIPEDEV_hWriteLock); API_MsgQueueDelete(&p_pipedev->PIPEDEV_hMsgQueue); __SHEAP_FREE((PVOID)p_pipedev); return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: API_CanDevRemove ** 功能描述: 移除一个 CAN 设备 ** 输 入 : ** pcName 需要移除的 CAN 设备 ** bForce 模式选择 ** 输 出 : ERROR_NONE or PX_ERROR ** 全局变量: ** 调用模块: ** API 函数 *********************************************************************************************************/ LW_API INT API_CanDevRemove (PCHAR pcName, BOOL bForce) { __PCAN_PORT pDevHdr; PCHAR pcTail = LW_NULL; if (LW_CPU_GET_CUR_NESTING()) { _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n"); _ErrorHandle(ERROR_KERNEL_IN_ISR); return (PX_ERROR); } if (_G_iCanDrvNum <= 0) { _DebugHandle(__ERRORMESSAGE_LEVEL, "no driver.\r\n"); _ErrorHandle(ERROR_IO_NO_DRIVER); return (PX_ERROR); } pDevHdr = (__PCAN_PORT)iosDevFind(pcName, &pcTail); if ((pDevHdr == LW_NULL) || (pcName == pcTail)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "device not found.\r\n"); _ErrorHandle(ERROR_IOS_DEVICE_NOT_FOUND); return (PX_ERROR); } if (bForce == LW_FALSE) { if (LW_DEV_GET_USE_COUNT(&pDevHdr->CANPORT_can.CAN_devhdr)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "too many open files.\r\n"); _ErrorHandle(EBUSY); return (PX_ERROR); } if (SEL_WAKE_UP_LIST_LEN(&pDevHdr->CANPORT_can.CAN_selwulList) > 0) { errno = EBUSY; return (PX_ERROR); } } iosDevFileAbnormal(&pDevHdr->CANPORT_can.CAN_devhdr); iosDevDelete(&pDevHdr->CANPORT_can.CAN_devhdr); SEL_WAKE_UP_LIST_TERM(&pDevHdr->CANPORT_can.CAN_selwulList); __canDevDelete(&pDevHdr->CANPORT_can); __SHEAP_FREE((PVOID)pDevHdr); return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: __canClose ** 功能描述: CAN 设备关闭 ** 输 入 : ** pcanDev CAN 设备 ** 输 出 : CAN 设备指针 ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT __canClose (__CAN_DEV *pcanDev) { __CAN_PORT *pcanport = (__CAN_PORT *)pcanDev; if (LW_DEV_GET_USE_COUNT(&pcanDev->CAN_devhdr)) { if (!LW_DEV_DEC_USE_COUNT(&pcanDev->CAN_devhdr)) { if (pcanport->CANPORT_pcanchan->pDrvFuncs->ioctl) { pcanport->CANPORT_pcanchan->pDrvFuncs->ioctl(pcanport->CANPORT_pcanchan, CAN_DEV_CLOSE, LW_NULL); /* 挂起端口 */ } SEL_WAKE_UP_ALL(&pcanDev->CAN_selwulList, SELEXCEPT); /* 激活异常等待 */ } } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: _evtfdClose ** 功能描述: 关闭 eventfd 文件 ** 输 入 : pevtfdfil eventfd 文件 ** 输 出 : ERROR ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT _evtfdClose (PLW_EVTFD_FILE pevtfdfil) { if (pevtfdfil) { SEL_WAKE_UP_TERM(&pevtfdfil->EF_selwulist); if (LW_DEV_GET_USE_COUNT(&_G_evtfddev.ED_devhdrHdr)) { LW_DEV_DEC_USE_COUNT(&_G_evtfddev.ED_devhdrHdr); } API_SemaphoreBDelete(&pevtfdfil->EF_ulReadLock); API_SemaphoreBDelete(&pevtfdfil->EF_ulWriteLock); __SHEAP_FREE(pevtfdfil); return (ERROR_NONE); } else { return (PX_ERROR); } }
/********************************************************************************************************* ** 函数名称: _hotplugClose ** 功能描述: 关闭热插拔消息文件 ** 输 入 : photplugfil 热插拔消息文件 ** 输 出 : ERROR ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT _hotplugClose (PLW_HOTPLUG_FILE photplugfil) { if (photplugfil) { HOTPLUG_DEV_LOCK(); _List_Line_Del(&photplugfil->HOTPFIL_lineManage, &_G_hotplugdev.HOTPDEV_plineFile); HOTPLUG_DEV_UNLOCK(); _bmsgDelete(photplugfil->HOTPFIL_pbmsg); if (LW_DEV_GET_USE_COUNT(&_G_hotplugdev.HOTPDEV_devhdrHdr)) { LW_DEV_DEC_USE_COUNT(&_G_hotplugdev.HOTPDEV_devhdrHdr); } API_SemaphoreBDelete(&photplugfil->HOTPFIL_ulReadSync); __SHEAP_FREE(photplugfil); return (ERROR_NONE); } else { return (PX_ERROR); } }
/********************************************************************************************************* ** 函数名称: __romFsRemove ** 功能描述: romfs remove 操作 ** 输 入 : promfs 卷设备 ** pcName 文件名 ** 输 出 : < 0 表示错误 ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT __romFsRemove (PROM_VOLUME promfs, PCHAR pcName) { PLW_BLK_DEV pblkd; if (pcName == LW_NULL) { _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH); return (PX_ERROR); } if (__STR_IS_ROOT(pcName)) { if (__ROMFS_VOL_LOCK(promfs) != ERROR_NONE) { _ErrorHandle(ENXIO); return (PX_ERROR); } if (promfs->ROMFS_bValid == LW_FALSE) { __ROMFS_VOL_UNLOCK(promfs); return (ERROR_NONE); /* 正在被其他任务卸载 */ } __re_umount_vol: if (LW_DEV_GET_USE_COUNT((LW_DEV_HDR *)promfs)) { /* 检查是否有正在工作的文件 */ if (!promfs->ROMFS_bForceDelete) { __ROMFS_VOL_UNLOCK(promfs); _ErrorHandle(EBUSY); return (PX_ERROR); } promfs->ROMFS_bValid = LW_FALSE; __ROMFS_VOL_UNLOCK(promfs); _DebugHandle(__ERRORMESSAGE_LEVEL, "disk have open file.\r\n"); iosDevFileAbnormal(&promfs->ROMFS_devhdrHdr); /* 将所有相关文件设为异常模式 */ __ROMFS_VOL_LOCK(promfs); goto __re_umount_vol; } else { promfs->ROMFS_bValid = LW_FALSE; } pblkd = promfs->ROMFS_pblkd; if (pblkd) { __fsDiskLinkCounterDec(pblkd); /* 减少链接次数 */ } iosDevDelete((LW_DEV_HDR *)promfs); /* IO 系统移除设备 */ API_SemaphoreMDelete(&promfs->ROMFS_hVolLock); __SHEAP_FREE(promfs->ROMFS_pcSector); __SHEAP_FREE(promfs); _DebugHandle(__LOGMESSAGE_LEVEL, "romfs unmount ok.\r\n"); return (ERROR_NONE); } else { PCHAR pcTail = LW_NULL, pcSymfile, pcPrefix; ROMFS_DIRENT romfsdnt; if (__ROMFS_VOL_LOCK(promfs) != ERROR_NONE) { _ErrorHandle(ENXIO); return (PX_ERROR); } if (__rfs_open(promfs, pcName, &pcTail, &pcSymfile, &romfsdnt) == ERROR_NONE) { if (S_ISLNK(romfsdnt.ROMFSDNT_stat.st_mode)) { if (pcTail && lib_strlen(pcTail)) { /* 连接文件有后缀 */ pcSymfile--; /* 从 / 开始 */ if (pcSymfile == pcName) { pcPrefix = LW_NULL; /* 没有前缀 */ } else { pcPrefix = pcName; *pcSymfile = PX_EOS; } if (__rfs_path_build_link(promfs, &romfsdnt, pcName, PATH_MAX + 1, pcPrefix, pcTail) == ERROR_NONE) { __ROMFS_VOL_UNLOCK(promfs); return (FOLLOW_LINK_TAIL); } } } } __ROMFS_VOL_UNLOCK(promfs); _ErrorHandle(EROFS); return (PX_ERROR); } return (PX_ERROR); }