diff --git a/obj/object.c b/obj/object.c index 8be759b..ace0861 100644 --- a/obj/object.c +++ b/obj/object.c @@ -90,8 +90,6 @@ void object_deref(object_t *obj) } vm_cache_free(&obj->ob_type->ob_cache, obj); - - spin_unlock_irqrestore(&obj->ob_lock, flags); } void object_lock(object_t *obj, unsigned long *flags) diff --git a/obj/set.c b/obj/set.c index 582bf07..da9778b 100644 --- a/obj/set.c +++ b/obj/set.c @@ -20,7 +20,7 @@ static kern_status_t set_get_child_at(object_t *obj, size_t at, object_t **out) size_t i = 0; queue_foreach(object_t, child, &set->s_list, ob_list) { if (i == at) { - *out = child; + *out = object_ref(child); return KERN_OK; } @@ -42,7 +42,7 @@ static kern_status_t set_get_child_named(object_t *obj, const char *name, object } if (!strcmp(child_name, name)) { - *out = child; + *out = object_ref(child); return KERN_OK; } } @@ -104,6 +104,7 @@ kern_status_t set_add_object(object_t *set_obj, object_t *obj) } } + object_ref(obj); queue_push_back(&set->s_list, &obj->ob_list); return KERN_OK; } @@ -116,6 +117,7 @@ kern_status_t set_remove_object(object_t *set_obj, object_t *obj) struct set *set = object_data(set_obj); queue_delete(&set->s_list, &obj->ob_list); + object_deref(obj); return KERN_OK; }