Memory management for dynamic inlets/outlets


    May 24 2012 | 3:45 pm
    Hi folks,
    I am experimenting with dynalic inlets/outlets and they work like a charm.
    The only thing I am still uncertain about is the memory management associated with them.
    I am working on a DSP UI object and I have a scenario where I instantiate dynamic outlets in myobj_new() method as such:
    void *myobj_new(t_symbol *s, long ac, t_atom *av)
    {
        t_dictionary *d;
        t_myobj *x;
        long flags;
    
        if (!(d = object_dictionaryarg(ac, av))) {
            return NULL;
        }
        if (!(x = object_alloc(s_myobj_class))) {
            return NULL;
        }
        flags = 0
                | JBOX_DRAWFIRSTIN
                | JBOX_NODRAWBOX
                | JBOX_DRAWINLAST
                | JBOX_GROWBOTH
                ;
        jbox_new(&x->box.z_box, flags, ac, av);
        x->box.z_box.b_firstin = (t_object *)x;
    
        dsp_setupjbox(&x->box, 1);
    
        object_obex_store(x, _sym_dumpout, outlet_append((t_object *)x, NULL, NULL));
        x->out_3 = outlet_append((t_object *)x, NULL, gensym("list"));
        x->out_2 = outlet_append((t_object *)x, NULL, gensym("float"));
        x->out_1 = outlet_append((t_object *)x, NULL, gensym("int"));
        outlet_append((t_object *)x, NULL, gensym("signal"));
    
        attr_dictionary_process(x, d);
        jbox_ready(&x->box.z_box);
    
        return x;
    }
    This will create an object with 1 signal inlet and 1 signal outlet, then it will have 3 more message outlets (accepting ints floats and lists respectively) and finally one dumpout outlet stored in the object's obex. Great.
    In other parts of my code I manage the number of inlets and outlets with the appropriate functions.
    Everything works well so far...
    Here is myobj_free() method. That's what I am not so sure about...
    static void myobj_free(t_myobj *x)
    {
        // is this freeing all signal inlets and outlets???
        dsp_freejbox(&x->box);
    
        // first remove the dumpout outlet...
        void *outlet = NULL;
        object_obex_lookup(x, gensym("dumpout"), (t_object **)&outlet);
        hashtab_chuckkey(object_obex_get(x), gensym("dumpout"));
        outlet_delete(outlet);
    
        // ...then remove the other outlets
        outlet_delete(x->out_1);
        outlet_delete(x->out_2);
        outlet_delete(x->out_3);
    
        jbox_free(&x->box.z_box);
    }
    So, at the end of my object's life what am I supposed to do with regard to outlets memory management ?
    Should I free all outlets like the above or is it redundant/unnecessary ?
    Will Max take care of that for me like for regular outlets ?
    Does the same go for signal outlets?
    Thanks in advance for any help.
    - Luigi

    • Jun 18 2012 | 4:43 pm
      Hi Luigi,
      You should never have to worry about freeing outlets. That is taken care of by Max. For inlets you only need to worry if you are creating proxies.
      best,
      Tim