Beispiel #1
0
static void value_cleanup (struct value *v)
{
    if (v->parent || !LinkedList0_IsEmpty(&v->refs_list)) {
        return;
    }
    
    switch (v->type) {
        case NCDVALUE_STRING: {
            free(v->string.string);
        } break;
        
        case NCDVALUE_LIST: {
            while (value_list_len(v) > 0) {
                struct value *ev = value_list_at(v, 0);
                value_list_remove(v, ev);
                value_cleanup(ev);
            }
        } break;
        
        case NCDVALUE_MAP: {
            while (value_map_len(v) > 0) {
                struct value *ev = value_map_at(v, 0);
                value_map_remove(v, ev);
                value_cleanup(ev);
            }
        } break;
        
        default: ASSERT(0);
    }
    
    free(v);
}
static void delete_action(union pa_policy_context_action **actions,
                          union pa_policy_context_action  *action)
{
    union pa_policy_context_action *last;
    struct pa_policy_set_property  *setprop;

    for (last = (union pa_policy_context_action *)actions;
         last->any.next != NULL;
         last = last->any.next)
    {
        if (last->any.next == action) {
            last->any.next = action->any.next;

            switch (action->any.type) {

            case pa_policy_set_property:
                setprop = &action->setprop;

                match_cleanup(&setprop->object.match);
                pa_xfree(setprop->property);
                value_cleanup(&setprop->value);

                break;

            case pa_policy_set_default:
                /* no-op */
                break;

            default:
                pa_log("%s(): confused with data structure: invalid action "
                       "type %d", __FUNCTION__, action->any.type);
                return;         /* better to leak than corrupt :) */
            }

            pa_xfree(action);

            return;
        }
    }

    pa_log("%s(): confused with data structures: can't find action",
           __FUNCTION__);
}