static void vxCmdDestructor(MprCmd *cmd) { MprCmdFile *files; int i; if (cmd->startCond) { semDelete(cmd->startCond); } if (cmd->exitCond) { semDelete(cmd->exitCond); } files = cmd->files; for (i = 0; i < MPR_CMD_MAX_PIPE; i++) { if (files[i].name) { DEV_HDR *dev; #if _WRS_VXWORKS_MAJOR >= 6 cchar *tail; #else char *tail; #endif if ((dev = iosDevFind(files[i].name, &tail)) != NULL) { iosDevDelete(dev); } } } }
/** * @brief Enlever un périphérique. * @param i L'index du device à enlever * @return OK pour un succès, ERROR sinon. */ int pe_deviceRemove(int i) { semTake(mut_table_capt, WAIT_FOREVER); if(i < DEVICE_MAX_COUNT && table_capt[i].specific.state != notcreated) { iosDevDelete((DEV_HDR*)&(table_capt[i])); table_capt[i].specific.state = notcreated; table_capt[i].specific.address = -1; semGive(mut_table_capt); semTake(mut_table_capt, WAIT_FOREVER); table_buffer[i].id = -1; semGive(mut_table_buffer); return OK; } else { // Le capteur n'a pas été crée : // " If the device was never added to the device list, // unpredictable results may occur." semGive(mut_table_capt); errnoSet(ENEXIST); return ERROR; } }
/********************************************************************************************************* ** 函数名称: 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); }
int devDelete(char* devName) { myDev * i = first; char * pNameTail; myDev * dev = (myDev*) iosDevFind (devName,&pNameTail); if ((*pNameTail)!='\0' || dev==NULL) //If pNameTail is not '\0', either we don't have an exact match //or we have no match at all { errnoSet(UNKNOWN_DEVICE); semGive(semMAdmin); return -1; } if(semMAdmin==0) { errnoSet(NOT_INSTALLED); return -1; } if(semTake(semMAdmin,WAIT_FOREVER)==-1) { errnoSet(SEM_ERR); return -1; } if (dev->openned != 0) { //There are still openned file descriptors on this device, //we can't delete it, give back semaphores and leave. semGive(dev->semMData); errnoSet(OPENNED_DEV); semGive(semMAdmin); return -1; } iosDevDelete((DEV_HDR*)dev); //This only prevents further oppenings. //Find and delete the device in device list : if (dev==first) { first=dev->next; } else { for (i=first;i->next!=dev;i=i->next); i->next=dev->next; } semTake(dev->semMData,WAIT_FOREVER); //Let pending ops on this dev finish semDelete(dev->semMData); //We don't need to release it to delete it free(dev); semGive(semMAdmin); return 0; }
static void resetCmd(MprCmd *cmd, bool finalizing) { MprCmdFile *files; int i; assert(cmd); files = cmd->files; for (i = 0; i < MPR_CMD_MAX_PIPE; i++) { if (cmd->handlers[i]) { mprDestroyWaitHandler(cmd->handlers[i]); cmd->handlers[i] = 0; } if (files[i].clientFd >= 0) { close(files[i].clientFd); files[i].clientFd = -1; } if (files[i].fd >= 0) { close(files[i].fd); files[i].fd = -1; } #if VXWORKS if (files[i].name) { DEV_HDR *dev; cchar *tail; if ((dev = iosDevFind(files[i].name, &tail)) != NULL) { iosDevDelete(dev); } } #endif } cmd->eofCount = 0; cmd->complete = 0; cmd->status = -1; if (cmd->pid && (!(cmd->flags & MPR_CMD_DETACH) || finalizing)) { mprStopCmd(cmd, -1); reapCmd(cmd, finalizing); cmd->pid = 0; } if (cmd->signal) { mprRemoveSignalHandler(cmd->signal); cmd->signal = 0; } }
void DSL_DRV_DeviceDelete(void) { DSL_int_t i; printf("Module will be unloaded"DSL_DRV_CRLF); DSL_DRV_Cleanup(); for (i = 0; i < DSL_DRV_MAX_ENTITIES; i++) { iosDevDelete(&DSL_DevHeader[i].DevHdr); } /* remove the driver also */ iosDrvRemove(DSL_DRV_DrvNum, IFX_TRUE); /* and allow new DevCreate */ DSL_DRV_DrvNum = -1; }
int drvRemove() { myDev * i = first; myDev * drv; if (semMAdmin == 0) { errnoSet(NOT_INSTALLED); return -1; } if (semTake(semMAdmin,WAIT_FOREVER)==-1) { errnoSet(SEM_ERR); return -1; } if (iosDrvRemove(numPilote,1) == -1) //And force closure of open files { errnoSet(REMOVE_ERROR); semGive(semMAdmin); return -1; } taskDelete(tMsgDispatchID); msgQDelete(isrmq); //Delete all devices : while (i!=NULL) { drv = i; i = drv->next; iosDevDelete((DEV_HDR*)drv); semTake(drv->semMData,WAIT_FOREVER); //Let pending ops finish semDelete(drv->semMData); free(drv); } numPilote = -1; first = NULL; semDelete(semMAdmin); semMAdmin=0; return 0; }
/********************************************************************************************************* ** 函数名称: __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); }