diff -r ee53be7e18ee -r e4b76dc7910c master/slave.c --- a/master/slave.c Thu Oct 26 16:45:33 2006 +0000 +++ b/master/slave.c Fri Oct 27 09:19:58 2006 +0000 @@ -189,6 +189,34 @@ /** Slave destructor. + Clears and frees a slave object. +*/ + +void ec_slave_destroy(ec_slave_t *slave /**< EtherCAT slave */) +{ + ec_sdo_t *sdo, *next_sdo; + + // free all SDOs + list_for_each_entry_safe(sdo, next_sdo, &slave->sdo_dictionary, list) { + list_del(&sdo->list); + ec_sdo_destroy(sdo); + } + + // free SDO kobject + if (slave->sdo_dictionary_fetched) kobject_del(&slave->sdo_kobj); + kobject_put(&slave->sdo_kobj); + + // destroy self + kobject_del(&slave->kobj); + kobject_put(&slave->kobj); +} + +/*****************************************************************************/ + +/** + Clear and free slave. + This method is called by the kobject, + once there are no more references to it. */ void ec_slave_clear(struct kobject *kobj /**< kobject of the slave */) @@ -198,7 +226,6 @@ ec_sii_sync_t *sync, *next_sync; ec_sii_pdo_t *pdo, *next_pdo; ec_sii_pdo_entry_t *entry, *next_ent; - ec_sdo_t *sdo, *next_sdo; ec_sdo_data_t *sdodata, *next_sdodata; slave = container_of(kobj, ec_slave_t, kobj); @@ -235,17 +262,6 @@ if (slave->sii_order) kfree(slave->sii_order); if (slave->sii_name) kfree(slave->sii_name); - // free all SDOs - list_for_each_entry_safe(sdo, next_sdo, &slave->sdo_dictionary, list) { - list_del(&sdo->list); - kobject_del(&sdo->kobj); - kobject_put(&sdo->kobj); - } - - // free SDO kobject FIXME - if (slave->sdo_dictionary_fetched) kobject_del(&slave->sdo_kobj); - kobject_put(&slave->sdo_kobj); - // free all SDO configurations list_for_each_entry_safe(sdodata, next_sdodata, &slave->sdo_confs, list) { list_del(&sdodata->list);