Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2365
Modified Files: Tag: desiredata kernel.c Log Message: added pd_free_zombie
Index: kernel.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/Attic/kernel.c,v retrieving revision 1.1.2.39 retrieving revision 1.1.2.40 diff -C2 -d -r1.1.2.39 -r1.1.2.40 *** kernel.c 10 Jan 2007 03:15:29 -0000 1.1.2.39 --- kernel.c 15 Jan 2007 23:12:01 -0000 1.1.2.40 *************** *** 125,129 **** self->i = 0; self->tab = (t_hashentry **)malloc(capa*sizeof(void*)); - // fprintf(stderr,"hash_set %d\n",capa); for (long i=0; i<capa; i++) self->tab[i]=0; return self; --- 125,128 ---- *************** *** 299,303 **** t_pd *x = (t_pd *)getbytes(c->size); x->_class = c; ! hash_set(object_table,x,(void*)0); if (c->gobj) ((t_gobj *)x)->g_adix = appendix_new((t_gobj *)x); if (c->patchable) { --- 298,302 ---- t_pd *x = (t_pd *)getbytes(c->size); x->_class = c; ! hash_set(object_table,x,(void*)1); if (c->gobj) ((t_gobj *)x)->g_adix = appendix_new((t_gobj *)x); if (c->patchable) { *************** *** 308,316 **** }
void pd_free(t_pd *x) { t_class *c = x->_class; if (c->freemethod) ((t_gotfn)(c->freemethod))(x); - if (c->gobj) appendix_free((t_gobj *)x); - hash_delete(object_table,x); if (c->patchable) { t_object *y = (t_object *)x; --- 307,319 ---- }
+ extern "C" void pd_free_zombie(t_pd *x) { + t_class *c = x->_class; + if (c->gobj) appendix_free((t_gobj *)x); + if (c->size) free(x); + } + void pd_free(t_pd *x) { t_class *c = x->_class; if (c->freemethod) ((t_gotfn)(c->freemethod))(x); if (c->patchable) { t_object *y = (t_object *)x; *************** *** 319,323 **** if (y->ob_binbuf) binbuf_free(y->ob_binbuf); } ! if (c->size) free(x); }
--- 322,327 ---- if (y->ob_binbuf) binbuf_free(y->ob_binbuf); } ! /* schedule for deletion if need to keep the allocation around */ ! if (c->gobj && 0 /*is in the client*/) hash_set(object_table,x,0); else pd_free_zombie(x); }
*************** *** 1343,1349 **** /* this routine is called when a new "object" is requested whose class Pd doesn't know. Pd tries to load it as an extern, then as an abstraction. */ ! void new_anything(void *dummy, t_symbol *s, int argc, t_atom *argv) ! { ! t_pd *current; int fd; char dirbuf[MAXPDSTRING], *nameptr; --- 1347,1351 ---- /* this routine is called when a new "object" is requested whose class Pd doesn't know. Pd tries to load it as an extern, then as an abstraction. */ ! void new_anything(void *dummy, t_symbol *s, int argc, t_atom *argv) { int fd; char dirbuf[MAXPDSTRING], *nameptr; *************** *** 1351,1356 **** newest = 0; class_loadsym = s; ! if (sys_load_lib(canvas_getcurrent(), s->name)) ! { tryingalready = 1; typedmess((t_pd *)dummy, s, argc, argv); --- 1353,1357 ---- newest = 0; class_loadsym = s; ! if (sys_load_lib(canvas_getcurrent(), s->name)) { tryingalready = 1; typedmess((t_pd *)dummy, s, argc, argv); *************** *** 1359,1363 **** } class_loadsym = 0; ! current = s__X.thing; if ((fd = canvas_open(canvas_getcurrent(), s->name, ".pd", dirbuf, &nameptr, MAXPDSTRING, 0)) >= 0 || (fd = canvas_open(canvas_getcurrent(), s->name, ".pat", dirbuf, &nameptr, MAXPDSTRING, 0)) >= 0) { --- 1360,1364 ---- } class_loadsym = 0; ! t_pd *current = s__X.thing; if ((fd = canvas_open(canvas_getcurrent(), s->name, ".pd", dirbuf, &nameptr, MAXPDSTRING, 0)) >= 0 || (fd = canvas_open(canvas_getcurrent(), s->name, ".pat", dirbuf, &nameptr, MAXPDSTRING, 0)) >= 0) { *************** *** 1366,1371 **** canvas_setargs(argc, argv); /* bug fix by Krzysztof Czaja */ binbuf_evalfile(gensym(nameptr), gensym(dirbuf)); ! if (s__X.thing != current) ! canvas_popabstraction((t_canvas *)(s__X.thing)); canvas_setargs(0, 0); } --- 1367,1371 ---- canvas_setargs(argc, argv); /* bug fix by Krzysztof Czaja */ binbuf_evalfile(gensym(nameptr), gensym(dirbuf)); ! if (s__X.thing != current) canvas_popabstraction((t_canvas *)s__X.thing); canvas_setargs(0, 0); } *************** *** 1805,1812 **** }
! /* convert a binbuf to text with null termination and malloc. */ char *binbuf_gettext2(t_binbuf *x) { ! char *buf = (char *)malloc(MAXPDSTRING); ! int n; binbuf_gettext(x,&buf,&n); buf[n] = 0; --- 1805,1811 ---- }
! /* convert a binbuf to text with null termination, as return value */ char *binbuf_gettext2(t_binbuf *x) { ! char *buf; int n; binbuf_gettext(x,&buf,&n); buf[n] = 0; *************** *** 1897,1901 **** int newsize = x->n + argc, i; t_atom *ap; ! ap = (t_atom *)realloc(x->v,newsize*sizeof(*x->v)); if (!ap) { error("binbuf_addmessage: out of space"); --- 1896,1900 ---- int newsize = x->n + argc, i; t_atom *ap; ! ap = (t_atom *)realloc(x->v,(newsize+1)*sizeof(*x->v)); if (!ap) { error("binbuf_addmessage: out of space"); *************** *** 2069,2073 **** if (!sscanf(s->name,".x%lx",(long*)&target)) target=0; if (target) { ! if (!hash_exists(object_table,target)) { error("%s target is not a currently valid pointer",s->name); return; --- 2068,2072 ---- if (!sscanf(s->name,".x%lx",(long*)&target)) target=0; if (target) { ! if (!hash_exists(object_table,target) || !hash_get(object_table,target)) { error("%s target is not a currently valid pointer",s->name); return;