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; }
/** * @brief Retirer le driver. * @return OK en cas de succès, ERROR sinon. */ int pe_driverUninstall() { int i; if(driver_id != -1) { /* L'appel ne renvoit pas d'erreur bien que des capteurs soient ouverts. * Nous vérifions donc qu'aucun capteur ne soit ouvert. */ semTake(mut_table_capt, WAIT_FOREVER); for(i=0; i < DEVICE_MAX_COUNT; ++i) { if(table_capt[i].specific.state == opened) { errnoSet(ECPTBUSY); return ERROR; } } semGive(mut_table_capt); if(iosDrvRemove(driver_id, FALSE) == ERROR) { // The driver has open files. errnoSet(ECPTBUSY); return ERROR; } driver_id = -1; if(pe_cleanup_resources() == ERROR) { return ERROR; } } else { errnoSet(ENINSTALLED); return ERROR; } return OK; }
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; }