Erl_interface's fixed term allocator
Torbjorn Tornkvist
tobbe@REDACTED
Sun Oct 17 23:30:41 CEST 1999
> I use erl_free_term() to free each ETERM that I allocate. Some
> investigation suggests that this is not enough. Apparently this
> just moves the memory to a "freelist".
Let's see if I remember this correct. The erl_interface
library uses a sort of reference counting system to keep track
of allocated ETERM structs. So if you write:
ETERM *t_arr[2];
ETERM *t1;
t_arr[0] = erl_mk_atom("hello");
t_arr[1] = erl_mk_atom("world");
t1 = erl_mk_tuple(&t_arr[0],2);
you have created three (3) Erlang terms (ETERM). Now if you
call: erl_free_term(t1) you only free upp the tuple not the
other two ETERM's. To free all the allocated memory, you
would have to call:
erl_free_term(t_arr[0]);
erl_free_term(t_arr[1]);
erl_free_term(t1)
To avoid all these calls to erl_free_term() you can use:
erl_free_compund() instead. It does a "deep" free of
all ETERM's. So the above could be accomplished with:
erl_free_compund(t1)
Thus, this routine makes it possible for you to write
in a more compact way where you don't have to remember
the references to all sub-component ETERM's.
Example:
ETERM *list;
list = erl_cons(erl_mk_int(36),
erl_cons(erl_mk_atom("tobbe"),
erl_mk_empty_list()));
... /* do some work */
erl_free_compound(list);
Cheers /Tobbe
(Ps. I guess it is obvious that after a call to erl_free_compound(t1)
in the first example you must not call erl_free_term(t_arr[i])
(where i = 0 or 1). )
More information about the erlang-questions
mailing list