Update of /cvsroot/agd/server/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4242
Modified Files:
object.c
Log Message:
program_t references and garbage collection.
Index: object.c
===================================================================
RCS file: /cvsroot/agd/server/src/object.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** object.c 12 Mar 2004 08:40:10 -0000 1.5
--- object.c 15 Mar 2004 18:52:39 -0000 1.6
***************
*** 71,80 ****
{
list_remove(&all_objects, ob);
! if(ob->prog) {
! free_array(&ob->prog->fun_table, NULL); /* Will probably crash. */
! free_array(&ob->prog->functions, free_fun);
! free_array(&ob->prog->variables, (void (*)(void*))free_var);
! xfree(ob->prog);
}
if(ob->name)
xfree(ob->name);
--- 71,83 ----
{
list_remove(&all_objects, ob);
! if(unref_prog(ob->prog)) {
! ob->prog = NULL;
}
+ /*
+ free_array(&ob->prog->fun_table, NULL);
+ free_array(&ob->prog->functions, free_fun);
+ xfree(ob->prog);
+ */
+ free_array(&ob->variables, (void (*)(void*))free_var);
if(ob->name)
xfree(ob->name);
***************
*** 98,101 ****
--- 101,122 ----
}
+ void ref_prog(program_t *prog)
+ {
+ prog->ref++;
+ }
+
+ /* Returns 1 if program was freed. */
+ int unref_prog(program_t *prog)
+ {
+ prog->ref--;
+ if(prog->ref <= 0) {
+ free_array(&prog->functions, free_fun);
+ free_array(&prog->fun_table, NULL);
+ xfree(prog);
+ return 1;
+ }
+ return 0;
+ }
+
object_t *find_object(char *s)
{
***************
*** 151,158 ****
sprintf(new_ob->name, "%s#%d", base_ob->name, base_ob->ref);
! new_ob->prog = type_xmalloc(program_t);
new_ob->prog->fun_table = *copy_array(&base_ob->prog->fun_table, NULL);
! new_ob->prog->functions = *copy_array(&base_ob->prog->functions, (void*(*)(void *)) copy_fun);
! new_ob->prog->variables = *copy_array(&base_ob->prog->variables, (void*(*)(void*)) copy_var);
apply(new_ob, "create", NULL);
--- 172,183 ----
sprintf(new_ob->name, "%s#%d", base_ob->name, base_ob->ref);
! /*new_ob->prog = type_xmalloc(program_t);
new_ob->prog->fun_table = *copy_array(&base_ob->prog->fun_table, NULL);
! new_ob->prog->functions = *copy_array(&base_ob->prog->functions, (void*(*)(void *)) copy_fun);*/
! new_ob->prog = base_ob->prog;
! ref_prog(new_ob->prog);
!
! /* Memory leak? */
! new_ob/*->prog*/->variables = *copy_array(&base_ob/*->prog*/->variables, (void*(*)(void*)) copy_var);
apply(new_ob, "create", NULL);
|