Example #1
0
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);
            }
        }
    }
}
Example #2
0
/**
 * @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;
	}
}
Example #3
0
/*********************************************************************************************************
** 函数名称: 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);
}
Example #4
0
/*********************************************************************************************************
** 函数名称: 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);
}
Example #5
0
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;
}
Example #6
0
File: cmd.c Project: embedthis/mpr
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;
}
Example #8
0
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;
}
Example #9
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);
}