/* ARGSUSED */ static _prop_object_free_rv_t _prop_string_free(prop_stack_t stack, prop_object_t *obj) { prop_string_t ps = *obj; if ((ps->ps_flags & PS_F_NOCOPY) == 0 && ps->ps_mutable != NULL) _PROP_FREE(ps->ps_mutable, M_PROP_STRING); _PROP_POOL_PUT(_prop_string_pool, ps); return (_PROP_OBJECT_FREE_DONE); }
static _prop_object_free_rv_t _prop_array_free(prop_stack_t stack, prop_object_t *obj) { prop_array_t pa = *obj; prop_object_t po; _PROP_ASSERT(pa->pa_count <= pa->pa_capacity); _PROP_ASSERT((pa->pa_capacity == 0 && pa->pa_array == NULL) || (pa->pa_capacity != 0 && pa->pa_array != NULL)); /* The easy case is an empty array, just free and return. */ if (pa->pa_count == 0) { if (pa->pa_array != NULL) _PROP_FREE(pa->pa_array, M_PROP_ARRAY); _PROP_RWLOCK_DESTROY(pa->pa_rwlock); _PROP_POOL_PUT(_prop_array_pool, pa); return (_PROP_OBJECT_FREE_DONE); } if (pa->pa_array == NULL) return _PROP_OBJECT_FREE_DONE; po = pa->pa_array[pa->pa_count - 1]; _PROP_ASSERT(po != NULL); if (stack == NULL) { /* * If we are in emergency release mode, * just let caller recurse down. */ *obj = po; return (_PROP_OBJECT_FREE_FAILED); } /* Otherwise, try to push the current object on the stack. */ if (!_prop_stack_push(stack, pa, NULL, NULL, NULL)) { /* Push failed, entering emergency release mode. */ return (_PROP_OBJECT_FREE_FAILED); } /* Object pushed on stack, caller will release it. */ --pa->pa_count; *obj = po; return (_PROP_OBJECT_FREE_RECURSE); }