From: Peep P. <so...@us...> - 2004-03-15 19:01:55
|
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); |