diff -r ee53be7e18ee -r e4b76dc7910c master/canopen.c --- a/master/canopen.c Thu Oct 26 16:45:33 2006 +0000 +++ b/master/canopen.c Fri Oct 27 09:19:58 2006 +0000 @@ -132,19 +132,35 @@ /** SDO destructor. -*/ - -void ec_sdo_clear(struct kobject *kobj /**< SDO's kobject */) -{ - ec_sdo_t *sdo = container_of(kobj, ec_sdo_t, kobj); + Clears and frees an SDO object. +*/ + +void ec_sdo_destroy(ec_sdo_t *sdo /**< SDO */) +{ ec_sdo_entry_t *entry, *next; // free all entries list_for_each_entry_safe(entry, next, &sdo->entries, list) { list_del(&entry->list); - kobject_del(&entry->kobj); - kobject_put(&entry->kobj); - } + ec_sdo_entry_destroy(entry); + } + + // destroy self + kobject_del(&sdo->kobj); + kobject_put(&sdo->kobj); +} + +/*****************************************************************************/ + +/** + Clear and free SDO. + This method is called by the kobject, + once there are no more references to it. +*/ + +void ec_sdo_clear(struct kobject *kobj /**< SDO's kobject */) +{ + ec_sdo_t *sdo = container_of(kobj, ec_sdo_t, kobj); if (sdo->name) kfree(sdo->name); @@ -215,7 +231,23 @@ /*****************************************************************************/ /** - SDO destructor. + SDO entry destructor. + Clears and frees an SDO entry object. +*/ + +void ec_sdo_entry_destroy(ec_sdo_entry_t *entry /**< SDO entry */) +{ + // destroy self + kobject_del(&entry->kobj); + kobject_put(&entry->kobj); +} + +/*****************************************************************************/ + +/** + Clear and free SDO entry. + This method is called by the kobject, + once there are no more references to it. */ void ec_sdo_entry_clear(struct kobject *kobj /**< SDO entry's kobject */)