Update of /cvsroot/pure-data/externals/grill/flext/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22644/source
Modified Files: flatom.cpp flbase.h flclass.h flext.cpp flout.cpp flqueue.cpp flsupport.cpp flsupport.h Log Message: new flext::CopyAtoms function fixed dangerous spot (also memory leak) with message queuing flext::Forward has more incarnations now fixed and cleaned up library related stuff, especially co-existance of Max message and DSP library objects some minor changes after valgrind run more pthreads V2 fixes added message bundles (flext::MsgBundle) save some space saving inlet pointers fix uninitialized pointer update docs
Index: flqueue.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flqueue.cpp,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** flqueue.cpp 6 Dec 2005 21:52:26 -0000 1.34 --- flqueue.cpp 12 Dec 2005 00:18:21 -0000 1.35 *************** *** 39,129 **** static void Trigger();
! class qmsg: public flext, ! public Fifo::Cell { public: ! inline qmsg &Set(flext_base *t,int o,const t_symbol *s,int ac,const t_atom *av) ! { ! th = t; ! out = o; ! msg(s,ac,av); ! return *this; ! } ! ! inline qmsg &Set(const t_symbol *r,const t_symbol *s,int ac,const t_atom *av) ! { ! th = NULL; ! recv = r; ! msg(s,ac,av); ! return *this; ! }
! // \note PD sys lock must already be held by caller ! inline void Send() const { ! if(th) { ! if(out < 0) ! // message to self ! th->CbMethodHandler(-1-out,msg.Header(),msg.Count(),msg.Atoms()); ! else ! // message to outlet ! th->ToSysAnything(out,msg.Header(),msg.Count(),msg.Atoms()); } - else - flext::Forward(recv,msg,true); } - - private: - flext_base *th; - union { - int out; - const t_symbol *recv; - }; - AtomAnything msg; };
! typedef PooledFifo<qmsg> QueueFifo;
! class Queue: public flext, ! public QueueFifo { public: ! inline bool Empty() const { return Size() == 0; }
! inline void Push(flext_base *t,int o,const t_symbol *s,int ac,const t_atom *av) { ! qmsg *m = QueueFifo::New(); ! FLEXT_ASSERT(m); ! m->Set(t,o,s,ac,av); ! Put(m); ! Trigger(); }
! inline void Push(const t_symbol *r,const t_symbol *s,int ac,const t_atom *av) { ! qmsg *m = QueueFifo::New(); ! FLEXT_ASSERT(m); ! m->Set(r,s,ac,av); ! Put(m); ! Trigger(); }
! inline void Push(flext_base *th,int o) // bang { ! Push(th,o,sym_bang,0,NULL); }
! inline void Push(flext_base *th,int o,float dt) { t_atom at; SetFloat(at,dt); ! Push(th,o,sym_float,1,&at); }
! inline void Push(flext_base *th,int o,int dt) { t_atom at; --- 39,117 ---- static void Trigger();
! ! class flext::MsgBundle; ! ! typedef PooledFifoflext::MsgBundle QueueFifo; ! ! class Queue: public flext, ! public QueueFifo { public: ! inline bool Empty() const { return Size() == 0; }
! inline void Push(MsgBundle *m) { ! if(m) { ! Put(m); ! Trigger(); } } };
+ static Queue queue;
! #define STATSIZE 8
! class flext::MsgBundle: public flext, ! public Fifo::Cell { public: ! static MsgBundle *New() ! { ! MsgBundle *m = queue.New(); ! m->msg.Init(); ! return m; ! }
! static void Free(MsgBundle *m) ! { ! for(Msg *mi = m->msg.nxt; mi; ) { ! Msg *mn = mi->nxt; ! mi->Free(); ! delete mi; ! mi = mn; ! } ! m->msg.Free(); ! queue.Free(m); ! } ! ! inline MsgBundle &Add(flext_base *t,int o,const t_symbol *s,int ac,const t_atom *av) { ! Get()->Set(t,o,s,ac,av); ! return *this; }
! inline MsgBundle &Add(const t_symbol *r,const t_symbol *s,int ac,const t_atom *av) { ! Get()->Set(r,s,ac,av); ! return *this; }
! inline MsgBundle &Add(flext_base *th,int o) // bang { ! return Add(th,o,sym_bang,0,NULL); }
! inline MsgBundle &Add(flext_base *th,int o,float dt) { t_atom at; SetFloat(at,dt); ! return Add(th,o,sym_float,1,&at); }
! inline MsgBundle &Add(flext_base *th,int o,int dt) { t_atom at; *************** *** 137,151 **** #error Not implemented! #endif ! Push(th,o,sym,1,&at); }
! inline void Push(flext_base *th,int o,const t_symbol *dt) { t_atom at; SetSymbol(at,dt); ! Push(th,o,sym_symbol,1,&at); }
! void Push(flext_base *th,int o,const t_atom &a) { const t_symbol *sym; --- 125,139 ---- #error Not implemented! #endif ! return Add(th,o,sym,1,&at); }
! inline MsgBundle &Add(flext_base *th,int o,const t_symbol *dt) { t_atom at; SetSymbol(at,dt); ! return Add(th,o,sym_symbol,1,&at); }
! inline MsgBundle &Add(flext_base *th,int o,const t_atom &a) { const t_symbol *sym; *************** *** 164,179 **** else { error("atom type not supported"); ! return; } ! Push(th,o,sym,1,&a); }
! inline void Push(flext_base *th,int o,int argc,const t_atom *argv) { ! Push(th,o,sym_list,argc,argv); } - };
! static Queue queue;
--- 152,268 ---- else { error("atom type not supported"); ! return *this; } ! return Add(th,o,sym,1,&a); }
! inline MsgBundle &Add(flext_base *th,int o,int argc,const t_atom *argv) { ! return Add(th,o,sym_list,argc,argv); }
! // \note PD sys lock must already be held by caller ! inline void Send() const ! { ! FLEXT_ASSERT(msg.Ok()); ! ! const Msg *m = &msg; ! do { ! m->Send(); ! m = m->nxt; ! } while(m); ! } ! ! private: ! ! class Msg { ! public: ! inline bool Ok() const { return th || recv; } ! ! void Init() ! { ! th = NULL; ! recv = NULL; ! nxt = NULL; ! argc = 0; ! } ! ! void Free() ! { ! if(argc > STATSIZE) { ! FLEXT_ASSERT(argv); ! delete[] argv; ! } ! } ! ! void Set(flext_base *t,int o,const t_symbol *s,int ac,const t_atom *av) ! { ! FLEXT_ASSERT(t); ! th = t; ! out = o; ! SetMsg(s,ac,av); ! } ! ! void Set(const t_symbol *r,const t_symbol *s,int ac,const t_atom *av) ! { ! FLEXT_ASSERT(r); ! th = NULL; ! recv = r; ! SetMsg(s,ac,av); ! } ! ! void Send() const ! { ! if(th) { ! if(out < 0) ! // message to self ! th->CbMethodHandler(-1-out,sym,argc,argc > STATSIZE?argv:argl); ! else ! // message to outlet ! th->ToSysAnything(out,sym,argc,argc > STATSIZE?argv:argl); ! } ! else ! flext::SysForward(recv,sym,argc,argc > STATSIZE?argv:argl); ! } ! ! Msg *nxt; ! ! protected: ! flext_base *th; ! union { ! int out; ! const t_symbol *recv; ! }; ! const t_symbol *sym; ! int argc; ! union { ! t_atom *argv; ! t_atom argl[STATSIZE]; ! }; ! ! void SetMsg(const t_symbol *s,int cnt,const t_atom *lst) ! { ! sym = s; ! argc = cnt; ! if(cnt > STATSIZE) { ! argv = new t_atom[cnt]; ! flext::CopyAtoms(cnt,argv,lst); ! } ! else ! flext::CopyAtoms(cnt,argl,lst); ! } ! ! } msg; ! ! Msg *Get() ! { ! Msg *m = &msg; ! if(m->Ok()) { ! for(; m->nxt; m = m->nxt) {} ! m = m->nxt = new Msg; ! } ! return m; ! } ! };
*************** *** 202,209 **** #endif
! qmsg *q; while((q = queue.Get()) != NULL) { q->Send(); ! queue.Free(q); }
--- 291,298 ---- #endif
! flext::MsgBundle *q; while((q = queue.Get()) != NULL) { q->Send(); ! flext::MsgBundle::Free(q); }
*************** *** 330,386 **** }
void flext_base::ToQueueBang(int o) const { ! queue.Push(const_cast<flext_base *>(this),o); }
void flext_base::ToQueueFloat(int o,float f) const { ! queue.Push(const_cast<flext_base *>(this),o,f); }
void flext_base::ToQueueInt(int o,int f) const { ! queue.Push(const_cast<flext_base *>(this),o,f); }
void flext_base::ToQueueSymbol(int o,const t_symbol *s) const { ! queue.Push(const_cast<flext_base *>(this),o,s); }
void flext_base::ToQueueAtom(int o,const t_atom &at) const { ! queue.Push(const_cast<flext_base *>(this),o,at); }
void flext_base::ToQueueList(int o,int argc,const t_atom *argv) const { ! queue.Push(const_cast<flext_base *>(this),o,argc,argv); }
void flext_base::ToQueueAnything(int o,const t_symbol *s,int argc,const t_atom *argv) const { ! queue.Push(const_cast<flext_base *>(this),o,s,argc,argv); }
! bool flext::Forward(const t_symbol *recv,const t_symbol *s,int argc,const t_atom *argv,bool direct) { ! if(direct || IsSystemThread()) { ! void *cl = recv->s_thing; ! if(!cl) return false; ! #if FLEXT_SYS == FLEXT_SYS_PD ! pd_typedmess((t_class **)cl,(t_symbol *)s,argc,(t_atom *)argv); #elif FLEXT_SYS == FLEXT_SYS_MAX ! typedmess(recv->s_thing,(t_symbol *)s,argc,(t_atom *)argv); #else #error Not implemented #endif ! } ! else ! // send over queue ! queue.Push(recv,s,argc,argv); return true; } --- 419,561 ---- }
+ + flext::MsgBundle *flext::MsgNew() + { + return MsgBundle::New(); + } + + void flext::MsgFree(MsgBundle *m) + { + MsgBundle::Free(m); + } + + void flext::ToSysMsg(MsgBundle *m) + { + m->Send(); + queue.Free(m); + } + + void flext::ToQueueMsg(MsgBundle *m) + { + queue.Push(m); + } + + + void flext_base::ToQueueBang(int o) const { ! MsgBundle *m = MsgBundle::New(); ! m->Add(const_cast<flext_base *>(this),o); ! queue.Push(m); }
void flext_base::ToQueueFloat(int o,float f) const { ! MsgBundle *m = MsgBundle::New(); ! m->Add(const_cast<flext_base *>(this),o,f); ! queue.Push(m); }
void flext_base::ToQueueInt(int o,int f) const { ! MsgBundle *m = MsgBundle::New(); ! m->Add(const_cast<flext_base *>(this),o,f); ! queue.Push(m); }
void flext_base::ToQueueSymbol(int o,const t_symbol *s) const { ! MsgBundle *m = MsgBundle::New(); ! m->Add(const_cast<flext_base *>(this),o,s); ! queue.Push(m); }
void flext_base::ToQueueAtom(int o,const t_atom &at) const { ! MsgBundle *m = MsgBundle::New(); ! m->Add(const_cast<flext_base *>(this),o,at); ! queue.Push(m); }
void flext_base::ToQueueList(int o,int argc,const t_atom *argv) const { ! MsgBundle *m = MsgBundle::New(); ! m->Add(const_cast<flext_base *>(this),o,argc,argv); ! queue.Push(m); }
void flext_base::ToQueueAnything(int o,const t_symbol *s,int argc,const t_atom *argv) const { ! MsgBundle *m = MsgBundle::New(); ! m->Add(const_cast<flext_base *>(this),o,s,argc,argv); ! queue.Push(m); }
! void flext_base::MsgAddBang(MsgBundle *m,int n) const ! { ! m->Add(const_cast<flext_base *>(this),n); ! } ! ! void flext_base::MsgAddFloat(MsgBundle *m,int n,float f) const { ! m->Add(const_cast<flext_base *>(this),n,f); ! } ! ! void flext_base::MsgAddInt(MsgBundle *m,int n,int f) const ! { ! m->Add(const_cast<flext_base *>(this),n,f); ! } ! ! void flext_base::MsgAddSymbol(MsgBundle *m,int n,const t_symbol *s) const ! { ! m->Add(const_cast<flext_base *>(this),n,s); ! } ! ! void flext_base::MsgAddAtom(MsgBundle *m,int n,const t_atom &at) const ! { ! m->Add(const_cast<flext_base *>(this),n,at); ! } ! ! void flext_base::MsgAddList(MsgBundle *m,int n,int argc,const t_atom *argv) const ! { ! m->Add(const_cast<flext_base *>(this),n,argc,argv); ! } ! ! void flext_base::MsgAddAnything(MsgBundle *m,int n,const t_symbol *s,int argc,const t_atom *argv) const ! { ! m->Add(const_cast<flext_base *>(this),n,s,argc,argv); ! } ! ! ! ! ! bool flext::SysForward(const t_symbol *recv,const t_symbol *s,int argc,const t_atom *argv) ! { ! void *cl = recv->s_thing; ! if(!cl) return false; ! #if FLEXT_SYS == FLEXT_SYS_PD ! pd_typedmess((t_class **)cl,(t_symbol *)s,argc,(t_atom *)argv); #elif FLEXT_SYS == FLEXT_SYS_MAX ! typedmess(recv->s_thing,(t_symbol *)s,argc,(t_atom *)argv); #else #error Not implemented #endif ! return true; ! } ! ! bool flext::QueueForward(const t_symbol *recv,const t_symbol *s,int argc,const t_atom *argv) ! { ! MsgBundle *m = MsgBundle::New(); ! m->Add(recv,s,argc,argv); ! // send over queue ! queue.Push(m); ! return true; ! } ! ! bool flext::MsgForward(MsgBundle *m,const t_symbol *recv,const t_symbol *s,int argc,const t_atom *argv) ! { ! m->Add(recv,s,argc,argv); return true; }
Index: flout.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flout.cpp,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** flout.cpp 10 Dec 2005 21:34:08 -0000 1.25 --- flout.cpp 12 Dec 2005 00:18:21 -0000 1.26 *************** *** 46,55 **** #if defined(FLEXT_THREADS) #if FLEXT_QMODE == 2 ! #define CHKTHR() ((IsSystemThread() || IsThread(flext::thrmsgid)) && !InDsp()) #else ! #define CHKTHR() (IsSystemThread() && !InDsp()) #endif #else ! #define CHKTHR() (!InDsp()) #endif
--- 46,55 ---- #if defined(FLEXT_THREADS) #if FLEXT_QMODE == 2 ! #define CHKTHR() ((IsSystemThread() || IsThread(flext::thrmsgid)) && !InDSP()) #else ! #define CHKTHR() (IsSystemThread() && !InDSP()) #endif #else ! #define CHKTHR() (!InDSP()) #endif
*************** *** 62,65 **** --- 62,72 ---- void flext_base::ToOutAnything(int n,const t_symbol *s,int argc,const t_atom *argv) const { if(CHKTHR()) ToSysAnything(n,s,argc,argv); else ToQueueAnything(n,s,argc,argv); }
+ void flext::ToOutMsg(MsgBundle *mb) { if(CHKTHR()) ToSysMsg(mb); else ToQueueMsg(mb); } + + bool flext::Forward(const t_symbol *recv,const t_symbol *s,int argc,const t_atom *argv) + { + return CHKTHR()?SysForward(recv,s,argc,argv):QueueForward(recv,s,argc,argv); + } +
bool flext_base::InitInlets() *************** *** 87,91 ****
#if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX ! inlets = new px_object *[incnt]; #endif
--- 94,98 ----
#if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX ! inlets = incnt > 1?new px_object *[incnt]:NULL; #endif
*************** *** 105,109 **** // if(xi.desc && *xi.desc) class_settip(thisClass(),gensym(xi.desc)); #endif - inlets[0] = NULL; }
--- 112,115 ---- *************** *** 114,118 **** case xlet_float: case xlet_int: { ! inlets[ix] = NULL; char sym[] = "ft??"; if(ix >= 10) { --- 120,124 ---- case xlet_float: case xlet_int: { ! inlets[ix-1] = NULL; char sym[] = "ft??"; if(ix >= 10) { *************** *** 134,150 **** } case xlet_sym: ! (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages ! in = inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, (t_symbol *)sym_symbol, (t_symbol *)sym_symbol); break; case xlet_list: ! (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages ! in = inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, (t_symbol *)sym_list, (t_symbol *)sym_list); break; case xlet_any: ! (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages ! in = inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, 0, 0); break; case xlet_sig: ! inlets[ix] = NULL; if(compatibility && inlist[ix-1].tp != xlet_sig) { post("%s: All signal inlets must be left-aligned in compatibility mode",thisName()); --- 140,156 ---- } case xlet_sym: ! (inlets[ix-1] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages ! in = inlet_new(&x_obj->obj,&inlets[ix-1]->obj.ob_pd, (t_symbol *)sym_symbol, (t_symbol *)sym_symbol); break; case xlet_list: ! (inlets[ix-1] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages ! in = inlet_new(&x_obj->obj,&inlets[ix-1]->obj.ob_pd, (t_symbol *)sym_list, (t_symbol *)sym_list); break; case xlet_any: ! (inlets[ix-1] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages ! in = inlet_new(&x_obj->obj,&inlets[ix-1]->obj.ob_pd, 0, 0); break; case xlet_sig: ! inlets[ix-1] = NULL; if(compatibility && inlist[ix-1].tp != xlet_sig) { post("%s: All signal inlets must be left-aligned in compatibility mode",thisName()); *************** *** 159,163 **** break; default: ! inlets[ix] = NULL; error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)inlist[ix].tp); ok = false; --- 165,169 ---- break; default: ! inlets[ix-1] = NULL; error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)inlist[ix].tp); ok = false; *************** *** 181,185 **** xlet &xi = inlist[ix]; if(ix == 0) { - inlets[ix] = NULL; if(xi.tp != xlet_any) { error("%s: Leftmost inlet must be of type signal or anything",thisName()); --- 187,190 ---- *************** *** 190,194 **** switch(xi.tp) { case xlet_sig: ! inlets[ix] = NULL; error("%s: All signal inlets must be left-aligned",thisName()); ok = false; --- 195,199 ---- switch(xi.tp) { case xlet_sig: ! inlets[ix-1] = NULL; error("%s: All signal inlets must be left-aligned",thisName()); ok = false; *************** *** 196,200 **** case xlet_float: { if(ix < 10) { ! inlets[ix] = NULL; floatin(x_obj,ix); break; --- 201,205 ---- case xlet_float: { if(ix < 10) { ! inlets[ix-1] = NULL; floatin(x_obj,ix); break; *************** *** 205,209 **** case xlet_int: { if(ix < 10) { ! inlets[ix] = NULL; intin(x_obj,ix); break; --- 210,214 ---- case xlet_int: { if(ix < 10) { ! inlets[ix-1] = NULL; intin(x_obj,ix); break; *************** *** 216,223 **** case xlet_sym: case xlet_list: ! inlets[ix] = (px_object *)proxy_new(x_obj,ix,&((flext_hdr *)x_obj)->curinlet); break; default: ! inlets[ix] = NULL; error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)xi.tp); ok = false; --- 221,228 ---- case xlet_sym: case xlet_list: ! inlets[ix-1] = (px_object *)proxy_new(x_obj,ix,&((flext_hdr *)x_obj)->curinlet); break; default: ! inlets[ix-1] = NULL; error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)xi.tp); ok = false; *************** *** 226,230 **** }
! while(ix >= 0) inlets[ix--] = NULL; } #else --- 231,235 ---- }
! while(ix > 0) inlets[ix--] = NULL; } #else *************** *** 267,271 ****
#if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX ! outlets = new outlet *[outcnt+procattr];
// type info is now in list array --- 272,279 ----
#if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX ! if(outcnt+procattr) ! outlets = new outlet *[outcnt+procattr]; ! else ! outlets = NULL;
// type info is now in list array
Index: flsupport.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flsupport.h,v retrieving revision 1.101 retrieving revision 1.102 diff -C2 -d -r1.101 -r1.102 *** flsupport.h 10 Dec 2005 21:34:08 -0000 1.101 --- flsupport.h 12 Dec 2005 00:18:21 -0000 1.102 *************** *** 340,343 **** --- 340,346 ---- static void CopyAtom(t_atom *dst,const t_atom *src) { *dst = *src; }
+ //! Copy atoms + static void CopyAtoms(int cnt,t_atom *dst,const t_atom *src); + //! Print an atom static bool PrintAtom(const t_atom &a,char *buf,size_t bufsz); *************** *** 708,732 ****
! //! @} FLEXT_S_ATOM
// --- messages -------------------------------------------------------
/*! \defgroup FLEXT_S_MSG Flext message handling @{ */
! //! Send a message to a symbol (bound to an object) ! static bool Forward(const t_symbol *sym,const t_symbol *s,int argc,const t_atom *argv,bool forcedirect = false);
! static bool Forward(const t_symbol *sym,const AtomAnything &args,bool forcedirect = false) { return Forward(sym,args.Header(),args.Count(),args.Atoms(),forcedirect); } ! static bool Forward(const char *sym,const AtomAnything &args,bool forcedirect = false) { return Forward(MakeSymbol(sym),args.Header(),args.Count(),args.Atoms(),forcedirect); }
! static bool Forward(const t_symbol *sym,int argc,const t_atom *argv,bool forcedirect = false) { return Forward(sym,sym_list,argc,argv,forcedirect); }
! static bool Forward(const t_symbol *sym,const AtomList &args,bool forcedirect = false) { return Forward(sym,args.Count(),args.Atoms(),forcedirect); } ! static bool Forward(const char *sym,const AtomList &args,bool forcedirect = false) { return Forward(MakeSymbol(sym),args.Count(),args.Atoms(),forcedirect); }
! //! @} FLEXT_S_MSG
--- 711,776 ----
! //! @} FLEXT_S_ATOM
// --- messages -------------------------------------------------------
+ /*! \defgroup FLEXT_S_MSGBUNDLE Flext message handling + @{ + */ + + class MsgBundle; + + //! Make new message bundle + static MsgBundle *MsgNew(); + + //! Destroy message bundle + static void MsgFree(MsgBundle *mb); + + //! Send (and destroy) message bundle + static void ToSysMsg(MsgBundle *mb); + + //! Send (and destroy) message bundle + static void ToOutMsg(MsgBundle *mb); + + //! Send low priority (and destroy) message bundle + static void ToQueueMsg(MsgBundle *mb); + + //! @} FLEXT_S_MSGBUNDLE + + /*! \defgroup FLEXT_S_MSG Flext message handling @{ */
! static bool Forward(const t_symbol *sym,const t_symbol *s,int argc,const t_atom *argv); ! static bool Forward(const t_symbol *sym,const AtomAnything &args) { return Forward(sym,args.Header(),args.Count(),args.Atoms()); } ! static bool Forward(const char *sym,const AtomAnything &args) { return Forward(MakeSymbol(sym),args.Header(),args.Count(),args.Atoms()); } ! static bool Forward(const t_symbol *sym,int argc,const t_atom *argv) { return Forward(sym,sym_list,argc,argv); } ! static bool Forward(const t_symbol *sym,const AtomList &args) { return Forward(sym,args.Count(),args.Atoms()); } ! static bool Forward(const char *sym,const AtomList &args) { return Forward(MakeSymbol(sym),args.Count(),args.Atoms()); }
! static bool SysForward(const t_symbol *sym,const t_symbol *s,int argc,const t_atom *argv); ! static bool SysForward(const t_symbol *sym,const AtomAnything &args) { return SysForward(sym,args.Header(),args.Count(),args.Atoms()); } ! static bool SysForward(const char *sym,const AtomAnything &args) { return SysForward(MakeSymbol(sym),args.Header(),args.Count(),args.Atoms()); } ! static bool SysForward(const t_symbol *sym,int argc,const t_atom *argv) { return SysForward(sym,sym_list,argc,argv); } ! static bool SysForward(const t_symbol *sym,const AtomList &args) { return SysForward(sym,args.Count(),args.Atoms()); } ! static bool SysForward(const char *sym,const AtomList &args) { return SysForward(MakeSymbol(sym),args.Count(),args.Atoms()); }
! static bool QueueForward(const t_symbol *sym,const t_symbol *s,int argc,const t_atom *argv); ! static bool QueueForward(const t_symbol *sym,const AtomAnything &args) { return QueueForward(sym,args.Header(),args.Count(),args.Atoms()); } ! static bool QueueForward(const char *sym,const AtomAnything &args) { return QueueForward(MakeSymbol(sym),args.Header(),args.Count(),args.Atoms()); } ! static bool QueueForward(const t_symbol *sym,int argc,const t_atom *argv) { return QueueForward(sym,sym_list,argc,argv); } ! static bool QueueForward(const t_symbol *sym,const AtomList &args) { return QueueForward(sym,args.Count(),args.Atoms()); } ! static bool QueueForward(const char *sym,const AtomList &args) { return QueueForward(MakeSymbol(sym),args.Count(),args.Atoms()); }
! static bool MsgForward(MsgBundle *mb,const t_symbol *sym,const t_symbol *s,int argc,const t_atom *argv); ! static bool MsgForward(MsgBundle *mb,const t_symbol *sym,const AtomAnything &args) { return MsgForward(mb,sym,args.Header(),args.Count(),args.Atoms()); } ! static bool MsgForward(MsgBundle *mb,const char *sym,const AtomAnything &args) { return MsgForward(mb,MakeSymbol(sym),args.Header(),args.Count(),args.Atoms()); } ! static bool MsgForward(MsgBundle *mb,const t_symbol *sym,int argc,const t_atom *argv) { return MsgForward(mb,sym,sym_list,argc,argv); } ! static bool MsgForward(MsgBundle *mb,const t_symbol *sym,const AtomList &args) { return MsgForward(mb,sym,args.Count(),args.Atoms()); } ! static bool MsgForward(MsgBundle *mb,const char *sym,const AtomList &args) { return MsgForward(mb,MakeSymbol(sym),args.Count(),args.Atoms()); }
! //! @} FLEXT_S_MSG
*************** *** 1165,1168 **** --- 1209,1215 ---- //! @} FLEXT_S_TIMER
+ //! Check if we are in DSP time + static bool InDSP() { return indsp; } + // --- SIMD functionality -----------------------------------------------
*************** *** 1211,1214 **** --- 1258,1264 ---- static const t_symbol *sym_attributes; static const t_symbol *sym_methods; + + //! flag if we are within DSP + static bool indsp; };
Index: flext.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flext.cpp,v retrieving revision 1.42 retrieving revision 1.43 diff -C2 -d -r1.42 -r1.43 *** flext.cpp 3 Nov 2005 20:29:28 -0000 1.42 --- flext.cpp 12 Dec 2005 00:18:21 -0000 1.43 *************** *** 21,25 ****
bool flext_base::compatibility = true; - bool flext_base::indsp = false; const t_symbol *flext_base::curtag = NULL;
--- 21,24 ---- *************** *** 114,124 ****
if(inlets) { ! for(int ix = 0; ix < incnt; ++ix) ! if(inlets[ix]) { // release proxy object #if FLEXT_SYS == FLEXT_SYS_PD ! pd_free(&inlets[ix]->obj.ob_pd); #elif FLEXT_SYS == FLEXT_SYS_MAX ! freeobject((object *)inlets[ix]); #endif } --- 113,124 ----
if(inlets) { ! FLEXT_ASSERT(incnt > 1); ! for(int ix = 1; ix < incnt; ++ix) ! if(inlets[ix-1]) { // release proxy object #if FLEXT_SYS == FLEXT_SYS_PD ! pd_free(&inlets[ix-1]->obj.ob_pd); #elif FLEXT_SYS == FLEXT_SYS_MAX ! freeobject((object *)inlets[ix-1]); #endif }
Index: flbase.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flbase.h,v retrieving revision 1.35 retrieving revision 1.36 diff -C2 -d -r1.35 -r1.36 *** flbase.h 11 Oct 2005 22:22:48 -0000 1.35 --- flbase.h 12 Dec 2005 00:18:21 -0000 1.36 *************** *** 161,166 ****
bool HasAttributes() const; - bool IsDSP() const; bool IsLib() const;
#if FLEXT_SYS == FLEXT_SYS_MAX --- 161,166 ----
bool HasAttributes() const; bool IsLib() const; + bool IsDSP() const;
#if FLEXT_SYS == FLEXT_SYS_MAX
Index: flatom.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flatom.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** flatom.cpp 22 Mar 2005 04:56:28 -0000 1.14 --- flatom.cpp 12 Dec 2005 00:18:21 -0000 1.15 *************** *** 49,53 **** }
! static void copyatoms(int cnt,t_atom *dst,const t_atom *src) { if(dst < src) --- 49,53 ---- }
! void flext::CopyAtoms(int cnt,t_atom *dst,const t_atom *src) { if(dst < src) *************** *** 64,71 **** if(cnt == sz) return; // no change
! t_atom *l = new t_atom[sz]; ! if(keepix >= 0) ! // keep contents ! copyatoms(keeplen >= 0?keeplen:(cnt > sz?sz:cnt),l+keepto,lst+keepix); delete[] lst; lst = l,cnt = sz; --- 64,77 ---- if(cnt == sz) return; // no change
! t_atom *l; ! if(sz) { ! l = new t_atom[sz]; ! if(keepix >= 0) ! // keep contents ! CopyAtoms(keeplen >= 0?keeplen:(cnt > sz?sz:cnt),l+keepto,lst+keepix); ! } ! else ! l = NULL; ! delete[] lst; lst = l,cnt = sz; *************** *** 73,77 **** else { FLEXT_ASSERT(cnt == 0); ! lst = new t_atom[cnt = sz]; } } --- 79,83 ---- else { FLEXT_ASSERT(cnt == 0); ! if(sz) lst = new t_atom[cnt = sz]; } } *************** *** 95,99 ****
// argv can be NULL independently from argc ! if(argv) copyatoms(argc,lst+offs,argv);
return *this; --- 101,105 ----
// argv can be NULL independently from argc ! if(argv) CopyAtoms(argc,lst+offs,argv);
return *this; *************** *** 121,125 **** if(keepix >= 0) // keep contents ! copyatoms(keeplen >= 0?keeplen:(cnt > sz?sz:cnt),predata+keepto,lst+keepix); AtomList::Free(); } --- 127,131 ---- if(keepix >= 0) // keep contents ! CopyAtoms(keeplen >= 0?keeplen:(cnt > sz?sz:cnt),predata+keepto,lst+keepix); AtomList::Free(); }
Index: flsupport.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flsupport.cpp,v retrieving revision 1.55 retrieving revision 1.56 diff -C2 -d -r1.55 -r1.56 *** flsupport.cpp 10 Dec 2005 21:34:08 -0000 1.55 --- flsupport.cpp 12 Dec 2005 00:18:21 -0000 1.56 *************** *** 43,46 **** --- 43,48 ---- const t_symbol *flext::sym_methods = NULL;
+ bool flext::indsp = false; +
int flext::Version() { return FLEXT_VERSION; } *************** *** 78,82 **** sym_size = flext::MakeSymbol("size"); #endif ! sym_attributes = flext::MakeSymbol("attributes"); sym_methods = flext::MakeSymbol("methods"); --- 80,84 ---- sym_size = flext::MakeSymbol("size"); #endif ! sym_attributes = flext::MakeSymbol("attributes"); sym_methods = flext::MakeSymbol("methods");
Index: flclass.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flclass.h,v retrieving revision 1.66 retrieving revision 1.67 diff -C2 -d -r1.66 -r1.67 *** flclass.h 19 Nov 2005 23:10:53 -0000 1.66 --- flclass.h 12 Dec 2005 00:18:21 -0000 1.67 *************** *** 193,198 **** int CntOutSig() const { return outsigs; }
- //! Check if we are in DSP time - static bool InDsp() { return indsp; }
//! Retrieve currently processed message tag (NULL if no message processing) --- 193,196 ---- *************** *** 250,285 **** */
! //! Output bang (index n starts with 0) void ToQueueBang(int n) const;
! //! Output float (index n starts with 0) void ToQueueFloat(int n,float f) const;
! //! Output integer (index n starts with 0) void ToQueueInt(int n,int f) const;
! //! Output boolean (index n starts with 0) void ToQueueBool(int n,bool f) const { ToQueueInt(n,f?1:0); }
! //! Output symbol (index n starts with 0) void ToQueueSymbol(int n,const t_symbol *s) const; ! //! Output string aka symbol (to appointed outlet) void ToQueueString(int n,const char *s) const { ToQueueSymbol(n,MakeSymbol(s)); }
! //! Output atom (index n starts with 0) void ToQueueAtom(int n,const t_atom &at) const;
! //! Output list (index n starts with 0) void ToQueueList(int n,int argc,const t_atom *argv) const; ! //! Output list (index n starts with 0) void ToQueueList(int n,const AtomList &list) const { ToQueueList(n,list.Count(),list.Atoms()); }
! //! Output anything (index n starts with 0) void ToQueueAnything(int n,const t_symbol *s,int argc,const t_atom *argv) const; ! //! Output anything (index n starts with 0) void ToQueueAnything(int n,const AtomAnything &any) const { ToQueueAnything(n,any.Header(),any.Count(),any.Atoms()); }
! //! Send bang to self (inlet n) void ToSelfBang(int n) const { ToQueueBang(-1-n); }
--- 248,289 ---- */
! //! Output low priority bang (index n starts with 0) void ToQueueBang(int n) const;
! //! Output low priority float (index n starts with 0) void ToQueueFloat(int n,float f) const;
! //! Output low priority integer (index n starts with 0) void ToQueueInt(int n,int f) const;
! //! Output low priority boolean (index n starts with 0) void ToQueueBool(int n,bool f) const { ToQueueInt(n,f?1:0); }
! //! Output low priority symbol (index n starts with 0) void ToQueueSymbol(int n,const t_symbol *s) const; ! //! Output low priority string aka symbol (to appointed outlet) void ToQueueString(int n,const char *s) const { ToQueueSymbol(n,MakeSymbol(s)); }
! //! Output low priority atom (index n starts with 0) void ToQueueAtom(int n,const t_atom &at) const;
! //! Output low priority list (index n starts with 0) void ToQueueList(int n,int argc,const t_atom *argv) const; ! //! Output low priority list (index n starts with 0) void ToQueueList(int n,const AtomList &list) const { ToQueueList(n,list.Count(),list.Atoms()); }
! //! Output low priority anything (index n starts with 0) void ToQueueAnything(int n,const t_symbol *s,int argc,const t_atom *argv) const; ! //! Output low priority anything (index n starts with 0) void ToQueueAnything(int n,const AtomAnything &any) const { ToQueueAnything(n,any.Header(),any.Count(),any.Atoms()); }
+ //! @} FLEXT_C_IO_QUEUE
! ! /*! \defgroup FLEXT_C_IO_SELF Output of data to inlets/outlets of this object ! @{ ! */ ! ! //! Send bang to self (inlet n) void ToSelfBang(int n) const { ToQueueBang(-1-n); }
*************** *** 311,315 **** void ToSelfAnything(int n,const AtomAnything &any) const { ToSelfAnything(n,any.Header(),any.Count(),any.Atoms()); }
! //! @} FLEXT_C_IO_QUEUE
//! @} FLEXT_C_INOUT --- 315,388 ---- void ToSelfAnything(int n,const AtomAnything &any) const { ToSelfAnything(n,any.Header(),any.Count(),any.Atoms()); }
! //! @} FLEXT_C_IO_SELF ! ! ! /*! \defgroup FLEXT_C_IO_MESSAGEBUNDLE Output of data via message bundles ! ! These are used to assure the sending of several messages from a second thread to the same logical time ! ! @{ ! */ ! ! //! Output bang (index n starts with 0) ! void MsgAddBang(MsgBundle *mb,int n) const; ! ! //! Output float (index n starts with 0) ! void MsgAddFloat(MsgBundle *mb,int n,float f) const; ! ! //! Output integer (index n starts with 0) ! void MsgAddInt(MsgBundle *mb,int n,int f) const; ! ! //! Output boolean (index n starts with 0) ! void MsgAddBool(MsgBundle *mb,int n,bool f) const { MsgAddInt(mb,n,f?1:0); } ! ! //! Output symbol (index n starts with 0) ! void MsgAddSymbol(MsgBundle *mb,int n,const t_symbol *s) const; ! //! Output string aka symbol (to appointed outlet) ! void MsgAddString(MsgBundle *mb,int n,const char *s) const { MsgAddSymbol(mb,n,MakeSymbol(s)); } ! ! //! Output atom (index n starts with 0) ! void MsgAddAtom(MsgBundle *mb,int n,const t_atom &at) const; ! ! //! Output list (index n starts with 0) ! void MsgAddList(MsgBundle *mb,int n,int argc,const t_atom *argv) const; ! //! Output list (index n starts with 0) ! void MsgAddList(MsgBundle *mb,int n,const AtomList &list) const { MsgAddList(mb,n,list.Count(),list.Atoms()); } ! ! //! Output anything (index n starts with 0) ! void MsgAddAnything(MsgBundle *mb,int n,const t_symbol *s,int argc,const t_atom *argv) const; ! //! Output anything (index n starts with 0) ! void MsgAddAnything(MsgBundle *mb,int n,const AtomAnything &any) const { MsgAddAnything(mb,n,any.Header(),any.Count(),any.Atoms()); } ! ! void MsgSelfBang(MsgBundle *mb,int n) const { MsgAddBang(mb,-1-n); } ! ! //! Send float to self (inlet n) ! void MsgSelfFloat(MsgBundle *mb,int n,float f) const { MsgAddFloat(mb,-1-n,f); } ! ! //! Send integer to self (inlet n) ! void MsgSelfInt(MsgBundle *mb,int n,int f) const { MsgAddInt(mb,-1-n,f); } ! ! //! Send boolean to self (inlet n) ! void MsgSelfBool(MsgBundle *mb,int n,bool f) const { MsgSelfInt(mb,n,f?1:0); } ! ! //! Send symbol to self (inlet n) ! void MsgSelfSymbol(MsgBundle *mb,int n,const t_symbol *s) const { MsgAddSymbol(mb,-1-n,s); } ! //! Send string aka symbol to self (inlet 0) ! void MsgSelfString(MsgBundle *mb,int n,const char *s) const { MsgSelfSymbol(mb,n,MakeSymbol(s)); } ! ! //! Output atom (index n starts with 0) ! void MsgSelfAtom(MsgBundle *mb,int n,const t_atom &at) const { MsgAddAtom(mb,-1-n,at); } ! ! //! Send list to self (inlet n) ! void MsgSelfList(MsgBundle *mb,int n,int argc,const t_atom *argv) const { MsgAddList(mb,-1-n,argc,argv); } ! //! Send list to self (inlet n) ! void MsgSelfList(MsgBundle *mb,int n,const AtomList &list) const { MsgSelfList(mb,n,list.Count(),list.Atoms()); } ! ! //! Send anything to self (inlet n) ! void MsgSelfAnything(MsgBundle *mb,int n,const t_symbol *s,int argc,const t_atom *argv) const { MsgAddAnything(mb,-1-n,s,argc,argv); } ! //! Send anything to self (inlet n) ! void MsgSelfAnything(MsgBundle *mb,int n,const AtomAnything &any) const { MsgSelfAnything(mb,n,any.Header(),any.Count(),any.Atoms()); } ! ! //! @} FLEXT_C_IO_MESSAGEBUNDLE
//! @} FLEXT_C_INOUT *************** *** 765,768 **** --- 838,843 ---- void ToSysAtom(int n,const t_atom &at) const;
+ static void ToSysMsg(MsgBundle *mb); + // add class method handlers static void AddMessageMethods(t_class *c); *************** *** 799,805 **** static void AddAttrib(t_classid c,const t_symbol *attr,metharg tp,methfun gfun,methfun sfun);
- //! flag if we are within DSP - static bool indsp; - private:
--- 874,877 ----