Update of /cvsroot/pure-data/externals/grill/flext/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10738/source
Modified Files: flatom.cpp flbind.cpp flclass.h flmeth.cpp flqueue.cpp Log Message: ""
Index: flqueue.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flqueue.cpp,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** flqueue.cpp 21 Jun 2004 13:58:19 -0000 1.16 --- flqueue.cpp 11 Sep 2004 04:00:41 -0000 1.17 *************** *** 20,23 **** --- 20,24 ---- #include "flinternal.h"
+ #ifdef FLEXT_THREADS //! Thread id of message queue thread *************** *** 25,72 **** #endif
class qmsg { public: ! qmsg(flext_base *b): nxt(NULL),th(b),tp(tp_none) {} ! ~qmsg(); ! ! qmsg *nxt;
! void Clear();
! void SetBang(int o) { Clear(); out = o; tp = tp_bang; } ! void SetFloat(int o,float f) { Clear(); out = o; tp = tp_float; _float = f; } ! void SetInt(int o,int i) { Clear(); out = o; tp = tp_int; _int = i; } ! void SetSymbol(int o,const t_symbol *s) { Clear(); out = o; tp = tp_sym; _sym = s; } ! void SetList(int o,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_list; _list.argc = argc,_list.argv = flext::CopyList(argc,argv); } ! void SetAny(int o,const t_symbol *s,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_any; _any.s = s,_any.argc = argc,_any.argv = flext::CopyList(argc,argv); }
flext_base *th; int out; ! enum { tp_none,tp_bang,tp_float,tp_int,tp_sym,tp_list,tp_any } tp; ! union { ! float _float; ! int _int; ! const t_symbol *_sym; ! struct { int argc; t_atom *argv; } _list; ! struct { const t_symbol *s; int argc; t_atom *argv; } _any; ! }; };
! qmsg::~qmsg() ! { ! Clear(); ! if(nxt) delete nxt; ! }
! void qmsg::Clear() ! { ! if(tp == tp_list) { if(_list.argv) delete[] _list.argv; } ! else if(tp == tp_any) { if(_any.argv) delete[] _any.argv; } ! tp = tp_none; ! }
- static volatile int qcnt = 0; - static qmsg *volatile qhead = NULL,*volatile qtail = NULL;
#ifdef FLEXT_QTHR --- 26,177 ---- #endif
+ + #define QUEUE_LENGTH 256 + #define QUEUE_ATOMS 1024 + class qmsg { public: ! void Set(flext_base *t,int o,const t_symbol *s,int ac,const t_atom *av) { th = t,out = o,sym = s,argc = ac,argv = av; }
! // \note PD lock must already be held by caller ! void Send() const ! { ! if(out < 0) ! // message to self ! th->m_methodmain(-1-out,sym,argc,argv); ! else ! // message to outlet ! th->ToSysAnything(out,sym,argc,argv); ! }
! int Args() const { return argc; }
+ private: flext_base *th; int out; ! const t_symbol *sym; ! int argc; ! const t_atom *argv; };
! // _should_ work without locks.... have yet to check if it really does.... ! class Queue: ! public flext ! { ! public: ! Queue() ! { ! qhead = qtail = 0; ! ahead = atail = 0; ! }
! bool Empty() const { return qhead == qtail; } ! ! int Count() const ! { ! int c = qtail-qhead; ! return c >= 0?c:c+QUEUE_LENGTH; ! } ! ! const qmsg &Head() { return lst[qhead]; } ! ! void Pop() ! { ! PopAtoms(Head().Args()); ! qhead = (qhead+1)%QUEUE_LENGTH; ! } ! ! void Push(flext_base *th,int o) // bang ! { ! Set(th,o,sym_bang,0,NULL); ! } ! ! void Push(flext_base *th,int o,float dt) ! { ! t_atom *at = GetAtoms(1); ! SetFloat(*at,dt); ! Set(th,o,sym_float,1,at); ! } ! ! void Push(flext_base *th,int o,int dt) ! { ! t_atom *at = GetAtoms(1); ! SetInt(*at,dt); ! #if FLEXT_SYS == FLEXT_SYS_PD ! const t_symbol *sym = sym_float; ! #elif FLEXT_SYS == FLEXT_SYS_MAX ! const t_symbol *sym = sym_int; ! #else ! #error Not implemented! ! #endif ! Set(th,o,sym,1,at); ! } ! ! void Push(flext_base *th,int o,const t_symbol *dt) ! { ! t_atom *at = GetAtoms(1); ! SetSymbol(*at,dt); ! Set(th,o,sym_symbol,1,at); ! } ! ! void Push(flext_base *th,int o,int argc,const t_atom *argv) ! { ! t_atom *at = GetAtoms(argc); ! memcpy(at,argv,argc*sizeof(t_atom)); ! Set(th,o,sym_list,argc,at); ! } ! ! void Push(flext_base *th,int o,const t_symbol *sym,int argc,const t_atom *argv) ! { ! t_atom *at = GetAtoms(argc); ! memcpy(at,argv,argc*sizeof(t_atom)); ! Set(th,o,sym,argc,at); ! } ! ! protected: ! void Set(flext_base *th,int o,const t_symbol *sym,int argc,const t_atom *argv) ! { ! FLEXT_ASSERT(Count() < QUEUE_LENGTH-1); ! lst[qtail].Set(th,o,sym,argc,argv); ! qtail = (qtail+1)%QUEUE_LENGTH; ! } ! ! int CntAtoms() const ! { ! int c = atail-ahead; ! return c >= 0?c:c+QUEUE_ATOMS; ! } ! ! // must return contiguous region ! t_atom *GetAtoms(int argc) ! { ! // \todo check for available space ! ! if(atail+argc >= QUEUE_ATOMS) { ! atail = argc; ! return atoms; ! } ! else { ! t_atom *at = atoms+atail; ! atail += argc; ! return at; ! } ! } ! ! void PopAtoms(int argc) ! { ! const int p = ahead+argc; ! ahead = p >= QUEUE_ATOMS?argc:p; ! } ! ! int qhead,qtail; ! qmsg lst[QUEUE_LENGTH]; ! int ahead,atail; ! t_atom atoms[QUEUE_ATOMS]; ! }; ! ! static Queue queue;
#ifdef FLEXT_QTHR *************** *** 76,86 **** #endif
- #ifdef FLEXT_THREADS - static flext::ThrMutex qmutex; - #endif
#define CHUNK 10
! static void QWork(bool qlock,bool syslock) { for(;;) { --- 181,188 ---- #endif
#define CHUNK 10
! static void QWork(bool syslock) { for(;;) { *************** *** 89,93 **** // On the other hand, if new queue elements are added by the methods called // in the loop, these will be sent in the next tick to avoid recursion overflow. ! int qc = qcnt; if(!qc) break;
--- 191,195 ---- // On the other hand, if new queue elements are added by the methods called // in the loop, these will be sent in the next tick to avoid recursion overflow. ! int qc = queue.Count(); if(!qc) break;
*************** *** 96,168 **** #endif
! for(int i = 0; i < qc && qhead; ++i) { ! #ifdef FLEXT_THREADS ! if(qlock) qmutex.Lock(); ! #endif ! qmsg *m = qhead; ! qcnt--; ! qhead = m->nxt; ! if(!qhead) qtail = NULL; ! m->nxt = NULL; ! #ifdef FLEXT_THREADS ! if(qlock) qmutex.Unlock(); ! #endif ! ! if(m->out < 0) { ! // message to self ! ! const int n = -1-m->out; ! t_atom tmp; ! ! switch(m->tp) { ! case qmsg::tp_bang: ! m->th->m_methodmain(n,flext::sym_bang,0,&tmp); ! break; ! case qmsg::tp_float: ! flext::SetFloat(tmp,m->_float); ! m->th->m_methodmain(n,flext::sym_float,1,&tmp); ! break; ! case qmsg::tp_int: ! flext::SetInt(tmp,m->_int); ! #if FLEXT_SYS == FLEXT_SYS_PD ! m->th->m_methodmain(n,flext::sym_float,1,&tmp); ! #elif FLEXT_SYS == FLEXT_SYS_MAX ! m->th->m_methodmain(n,flext::sym_int,1,&tmp); ! #else ! #error Not implemented! ! #endif ! case qmsg::tp_sym: ! flext::SetSymbol(tmp,m->_sym); ! m->th->m_methodmain(n,flext::sym_symbol,1,&tmp); ! break; ! case qmsg::tp_list: ! m->th->m_methodmain(n,flext::sym_list,m->_list.argc,m->_list.argv); ! break; ! case qmsg::tp_any: ! m->th->m_methodmain(n,m->_any.s,m->_any.argc,m->_any.argv); ! break; ! #ifdef FLEXT_DEBUG ! default: ERRINTERNAL(); ! #endif ! } ! } ! else { ! // message to outlet ! ! switch(m->tp) { ! case qmsg::tp_bang: m->th->ToSysBang(m->out); break; ! case qmsg::tp_float: m->th->ToSysFloat(m->out,m->_float); break; ! case qmsg::tp_int: m->th->ToSysInt(m->out,m->_int); break; ! case qmsg::tp_sym: m->th->ToSysSymbol(m->out,m->_sym); break; ! case qmsg::tp_list: m->th->ToSysList(m->out,m->_list.argc,m->_list.argv); break; ! case qmsg::tp_any: m->th->ToSysAnything(m->out,m->_any.s,m->_any.argc,m->_any.argv); break; ! #ifdef FLEXT_DEBUG ! default: ERRINTERNAL(); ! #endif ! } ! } ! ! // delete processed queue element ! delete m; } // inner loop
--- 198,204 ---- #endif
! for(int i = 0; i < qc; ++i) { ! queue.Head().Send(); ! queue.Pop(); } // inner loop
*************** *** 171,175 **** #endif
! } // for(;;) }
--- 207,211 ---- #endif
! } }
*************** *** 182,190 **** { #endif - // post("qtick"); #ifdef FLEXT_THREADS FLEXT_ASSERT(flext::IsSystemThread()); #endif ! QWork(true,false); } #endif --- 218,225 ---- { #endif #ifdef FLEXT_THREADS FLEXT_ASSERT(flext::IsSystemThread()); #endif ! QWork(false); } #endif *************** *** 202,229 **** } #endif ! #ifdef FLEXT_THREADS ! qmutex.Lock(); ! #endif ! while(qcnt) QWork(false,false); ! #ifdef FLEXT_THREADS ! qmutex.Unlock(); ! #endif }
! static void Queue(qmsg *m) { - // post("Queue"); - - #ifdef FLEXT_THREADS - qmutex.Lock(); - #endif - if(qtail) qtail->nxt = m; - else qhead = m; - qtail = m; - qcnt++; - #ifdef FLEXT_THREADS - qmutex.Unlock(); - #endif - #if FLEXT_SYS == FLEXT_SYS_PD #ifdef FLEXT_QTHR --- 237,246 ---- } #endif ! ! while(!queue.Empty()) QWork(false); }
! static void Trigger() { #if FLEXT_SYS == FLEXT_SYS_PD #ifdef FLEXT_QTHR *************** *** 250,254 **** for(;;) { qthrcond.Wait(); ! QWork(true,true); } } --- 267,271 ---- for(;;) { qthrcond.Wait(); ! QWork(true); } } *************** *** 261,268 **** else started = true;
- // message queue ticker - qhead = qtail = NULL; - qcnt = 0; - #ifdef FLEXT_QTHR LaunchThread(QWorker,NULL); --- 278,281 ---- *************** *** 278,362 **** void flext_base::ToQueueBang(int o) const { ! FLEXT_ASSERT(o >= 0); ! qmsg *m = new qmsg(const_cast<flext_base *>(this)); ! m->SetBang(o); ! Queue(m); }
void flext_base::ToQueueFloat(int o,float f) const { ! FLEXT_ASSERT(o >= 0); ! qmsg *m = new qmsg(const_cast<flext_base *>(this)); ! m->SetFloat(o,f); ! Queue(m); }
void flext_base::ToQueueInt(int o,int f) const { ! FLEXT_ASSERT(o >= 0); ! qmsg *m = new qmsg(const_cast<flext_base *>(this)); ! m->SetInt(o,f); ! Queue(m); }
void flext_base::ToQueueSymbol(int o,const t_symbol *s) const { ! FLEXT_ASSERT(o >= 0); ! qmsg *m = new qmsg(const_cast<flext_base *>(this)); ! m->SetSymbol(o,s); ! Queue(m); }
void flext_base::ToQueueList(int o,int argc,const t_atom *argv) const { ! FLEXT_ASSERT(o >= 0); ! qmsg *m = new qmsg(const_cast<flext_base *>(this)); ! m->SetList(o,argc,argv); ! Queue(m); }
void flext_base::ToQueueAnything(int o,const t_symbol *s,int argc,const t_atom *argv) const { ! FLEXT_ASSERT(o >= 0); ! qmsg *m = new qmsg(const_cast<flext_base *>(this)); ! m->SetAny(o,s,argc,argv); ! Queue(m); ! } ! ! ! void flext_base::ToSelfBang(int n) const ! { ! FLEXT_ASSERT(n >= 0); ! ToQueueBang(-1-n); ! } ! ! void flext_base::ToSelfFloat(int n,float f) const ! { ! FLEXT_ASSERT(n >= 0); ! ToQueueFloat(-1-n,f); ! } ! ! void flext_base::ToSelfInt(int n,int f) const ! { ! FLEXT_ASSERT(n >= 0); ! ToQueueInt(-1-n,f); ! } ! ! void flext_base::ToSelfSymbol(int n,const t_symbol *s) const ! { ! FLEXT_ASSERT(n >= 0); ! ToQueueSymbol(-1-n,s); ! } ! ! void flext_base::ToSelfList(int n,int argc,const t_atom *argv) const ! { ! FLEXT_ASSERT(n >= 0); ! ToQueueList(-1-n,argc,argv); ! } ! ! void flext_base::ToSelfAnything(int n,const t_symbol *s,int argc,const t_atom *argv) const ! { ! FLEXT_ASSERT(n >= 0); ! ToQueueAnything(-1-n,s,argc,argv); } - --- 291,325 ---- void flext_base::ToQueueBang(int o) const { ! queue.Push(const_cast<flext_base *>(this),o); ! Trigger(); }
void flext_base::ToQueueFloat(int o,float f) const { ! queue.Push(const_cast<flext_base *>(this),o,f); ! Trigger(); }
void flext_base::ToQueueInt(int o,int f) const { ! queue.Push(const_cast<flext_base *>(this),o,f); ! Trigger(); }
void flext_base::ToQueueSymbol(int o,const t_symbol *s) const { ! queue.Push(const_cast<flext_base *>(this),o,s); ! Trigger(); }
void flext_base::ToQueueList(int o,int argc,const t_atom *argv) const { ! queue.Push(const_cast<flext_base *>(this),o,argc,argv); ! Trigger(); }
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); ! Trigger(); }
Index: flbind.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flbind.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** flbind.cpp 21 Jun 2004 13:58:19 -0000 1.14 --- flbind.cpp 11 Sep 2004 04:00:41 -0000 1.15 *************** *** 36,40 **** pxbnd_class = new t_class;
! pxbnd_class->c_sym = gensym(""); pxbnd_class->c_freelist = &px_freelist; pxbnd_class->c_freefun = NULL; --- 36,40 ---- pxbnd_class = new t_class;
! pxbnd_class->c_sym = sym__; pxbnd_class->c_freelist = &px_freelist; pxbnd_class->c_freefun = NULL; *************** *** 44,48 **** px_messlist[0].m_sym = (t_symbol *)pxbnd_class;
! px_messlist[1].m_sym = gensym("anything"); px_messlist[1].m_fun = (method)pxbnd_object::px_method; px_messlist[1].m_type[0] = A_GIMME; --- 44,48 ---- px_messlist[0].m_sym = (t_symbol *)pxbnd_class;
! px_messlist[1].m_sym = sym_anything; px_messlist[1].m_fun = (method)pxbnd_object::px_method; px_messlist[1].m_type[0] = A_GIMME;
Index: flatom.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flatom.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** flatom.cpp 3 Aug 2003 02:36:45 -0000 1.9 --- flatom.cpp 11 Sep 2004 04:00:41 -0000 1.10 *************** *** 43,49 **** t_atom *flext::CopyList(int argc,const t_atom *argv) { - int i; t_atom *dst = new t_atom[argc]; ! for(i = 0; i < argc; ++i) CopyAtom(dst+i,argv+i); return dst; } --- 43,48 ---- t_atom *flext::CopyList(int argc,const t_atom *argv) { t_atom *dst = new t_atom[argc]; ! memcpy(dst,argv,argc*sizeof(t_atom)); return dst; }
Index: flmeth.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flmeth.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** flmeth.cpp 21 Jun 2004 13:58:19 -0000 1.10 --- flmeth.cpp 11 Sep 2004 04:00:41 -0000 1.11 *************** *** 126,133 **** bool flext_base::ListMethods(int inlet) const { if(procattr) { AtomList la; ListMethods(la,inlet); ! ToOutAnything(GetOutAttr(),MakeSymbol("methods"),la.Count(),la.Atoms()); return true; } --- 126,135 ---- bool flext_base::ListMethods(int inlet) const { + static const t_symbol *sym_methods = MakeSymbol("methods"); + if(procattr) { AtomList la; ListMethods(la,inlet); ! ToOutAnything(GetOutAttr(),sym_methods,la.Count(),la.Atoms()); return true; }
Index: flclass.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flclass.h,v retrieving revision 1.44 retrieving revision 1.45 diff -C2 -d -r1.44 -r1.45 *** flclass.h 23 Apr 2004 22:14:12 -0000 1.44 --- flclass.h 11 Sep 2004 04:00:41 -0000 1.45 *************** *** 277,287 ****
//! Send bang to self (inlet n) ! void ToSelfBang(int n) const;
//! Send float to self (inlet n) ! void ToSelfFloat(int n,float f) const;
//! Send integer to self (inlet n) ! void ToSelfInt(int n,int f) const;
//! Send boolean to self (inlet n) --- 277,287 ----
//! Send bang to self (inlet n) ! void ToSelfBang(int n) const { ToQueueBang(-1-n); }
//! Send float to self (inlet n) ! void ToSelfFloat(int n,float f) const { ToQueueFloat(-1-n,f); }
//! Send integer to self (inlet n) ! void ToSelfInt(int n,int f) const { ToQueueInt(-1-n,f); }
//! Send boolean to self (inlet n) *************** *** 289,303 ****
//! Send symbol to self (inlet n) ! void ToSelfSymbol(int n,const t_symbol *s) const; //! Send string aka symbol to self (inlet 0) void ToSelfString(int n,const char *s) const { ToSelfSymbol(n,MakeSymbol(s)); }
//! Send list to self (inlet n) ! void ToSelfList(int n,int argc,const t_atom *argv) const; //! Send list to self (inlet n) void ToSelfList(int n,const AtomList &list) const { ToSelfList(n,list.Count(),list.Atoms()); }
//! Send anything to self (inlet n) ! void ToSelfAnything(int n,const t_symbol *s,int argc,const t_atom *argv) const; //! Send anything to self (inlet n) void ToSelfAnything(int n,const AtomAnything &any) const { ToSelfAnything(n,any.Header(),any.Count(),any.Atoms()); } --- 289,303 ----
//! Send symbol to self (inlet n) ! void ToSelfSymbol(int n,const t_symbol *s) const { ToQueueSymbol(-1-n,s); } //! Send string aka symbol to self (inlet 0) void ToSelfString(int n,const char *s) const { ToSelfSymbol(n,MakeSymbol(s)); }
//! Send list to self (inlet n) ! void ToSelfList(int n,int argc,const t_atom *argv) const { ToQueueList(-1-n,argc,argv); } //! Send list to self (inlet n) void ToSelfList(int n,const AtomList &list) const { ToSelfList(n,list.Count(),list.Atoms()); }
//! Send anything to self (inlet n) ! void ToSelfAnything(int n,const t_symbol *s,int argc,const t_atom *argv) const { ToQueueAnything(-1-n,s,argc,argv); } //! Send anything to self (inlet n) void ToSelfAnything(int n,const AtomAnything &any) const { ToSelfAnything(n,any.Header(),any.Count(),any.Atoms()); }