static int object_destroy ( hdb_handle_t object_handle) { struct object_instance *instance; unsigned int res; objdb_rdlock(); res = hdb_handle_get (&object_instance_database, object_handle, (void *)&instance); if (res != 0) { objdb_rdunlock(); return (res); } object_pre_deletion_notification(object_handle, instance->parent_handle, instance->object_name, instance->object_name_len); /* Recursively clear sub-objects & keys */ res = _clear_object(instance); list_del(&instance->child_list); free(instance->object_name); hdb_handle_put (&object_instance_database, object_handle); hdb_handle_destroy (&object_instance_database, object_handle); objdb_rdunlock(); return (res); }
static int _clear_object(struct object_instance *instance) { struct list_head *list; int res; struct object_instance *find_instance = NULL; struct object_key *object_key = NULL; struct object_tracker *tracker_pt = NULL; for (list = instance->key_head.next; list != &instance->key_head; ) { object_key = list_entry (list, struct object_key, list); list = list->next; list_del(&object_key->list); free(object_key->key_name); free(object_key->value); free(object_key); } for (list = instance->track_head.next; list != &instance->track_head;) { tracker_pt = list_entry (list, struct object_tracker, object_list); list = list->next; list_del(&tracker_pt->tracker_list); list_del(&tracker_pt->object_list); free(tracker_pt); } for (list = instance->child_head.next; list != &instance->child_head; ) { find_instance = list_entry (list, struct object_instance, child_list); res = _clear_object(find_instance); if (res) return res; list = list->next; list_del(&find_instance->child_list); free(find_instance->object_name); hdb_handle_destroy (&object_instance_database, find_instance->object_handle); } return 0; }
static int _clear_object(struct object_instance *instance) { struct list_head *list; int res; struct object_instance *find_instance = NULL; struct object_key *object_key = NULL; for (list = instance->key_head.next; list != &instance->key_head; ) { object_key = list_entry (list, struct object_key, list); list = list->next; list_del(&object_key->list); free(object_key->key_name); free(object_key->value); free(object_key); } for (list = instance->child_head.next; list != &instance->child_head; ) { find_instance = list_entry (list, struct object_instance, child_list); res = _clear_object(find_instance); if (res) return res; list = list->next; list_del(&find_instance->child_list); free(find_instance->object_name); free(find_instance); } return 0; }