Пример #1
0
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);
}
Пример #2
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;
	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;
}
Пример #3
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;
}