static void pack_bang(t_pack *x) { int i, reentered = 0, size = x->x_n * sizeof (t_atom); t_gpointer *gp; t_atom *outvec; for (i = x->x_nptr, gp = x->x_gpointer; i--; gp++) if (!gpointer_check(gp, 1)) { pd_error(x, "pack: stale pointer"); return; } /* reentrancy protection. The first time through use the pre-allocated x_outvec; if we're reentered we have to allocate new memory. */ if (!x->x_outvec) { /* LATER figure out how to deal with reentrancy and pointers... */ if (x->x_nptr) post("pack_bang: warning: reentry with pointers unprotected"); outvec = t_getbytes(size); reentered = 1; } else { outvec = x->x_outvec; x->x_outvec = 0; } memcpy(outvec, x->x_vec, size); outlet_list(x->x_obj.ob_outlet, &s_list, x->x_n, outvec); if (reentered) t_freebytes(outvec, size); else x->x_outvec = outvec; }
static void hang_tick(t_hang *h) { t_pipe *x = h->h_owner; t_hang *h2, *h3; t_pipeout *p; int i; union word *w; if (x->x_hang == h) x->x_hang = h->h_next; else for (h2 = x->x_hang; (h3 = h2->h_next); h2 = h3) { if (h3 == h) { h2->h_next = h3->h_next; break; } } for (i = x->x_n, p = x->x_vec + (x->x_n - 1), w = h->h_vec + (x->x_n - 1); i--; p--, w--) { switch (p->p_atom.a_type) { case A_FLOAT: outlet_float(p->p_outlet, w->w_float); break; case A_SYMBOL: outlet_symbol(p->p_outlet, w->w_symbol); break; case A_POINTER: if (gpointer_check(w->w_gpointer, 1)) outlet_pointer(p->p_outlet, w->w_gpointer); else pd_error(x, "pipe: stale pointer"); break; default: break; } } hang_free(h); }