Update of /cvsroot/pure-data/externals/grill/py/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17461/source
Modified Files: main.cpp main.h py.cpp pyext.cpp Log Message: closed multi-interpreter branch (no chance to have several interpreters in the same thread!) other thread-related cleanups py: added ability to choose function from message tag enabled int-tags for pyext class methods
Index: pyext.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pyext.cpp,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** pyext.cpp 9 Jan 2005 04:59:30 -0000 1.23 --- pyext.cpp 10 Jan 2005 05:00:56 -0000 1.24 *************** *** 100,117 ****
- #if FLEXT_SYS == FLEXT_SYS_MAX - static short patcher_myvol(t_patcher *x) - { - t_box *w; - if (x->p_vol) - return x->p_vol; - else if (w = (t_box *)x->p_vnewobj) - return patcher_myvol(w->b_patcher); - else - return 0; - } - #endif - - PyObject *pyext::class_obj = NULL; PyObject *pyext::class_dict = NULL; --- 100,103 ---- *************** *** 510,521 **** char str[256];
! { ! // try tag/inlet sprintf(str,"%s_%i",GetString(s),n); ret = call(str,0,NULL,argc,argv); }
! if(!ret) { ! // try anything/inlet sprintf(str,"_anything_%i",n); if(s == sym_bang && !argc) { --- 496,522 ---- char str[256];
! bool isfloat = s == sym_float && argc == 1; ! ! // if float equals an integer, try int_* method ! if(isfloat && GetAFloat(argv[0]) == GetAInt(argv[0])) { ! sprintf(str,"int_%i",n); ! ret = call(str,0,NULL,1,argv); ! } ! ! // try tag/inlet ! if(!ret) { sprintf(str,"%s_%i",GetString(s),n); ret = call(str,0,NULL,argc,argv); }
! // try truncated int ! if(!ret && isfloat) { ! t_atom at; SetInt(at,GetAInt(argv[0])); ! sprintf(str,"int_%i",n); ! ret = call(str,0,NULL,1,&at); ! } ! ! // try anything/inlet ! if(!ret) { sprintf(str,"_anything_%i",n); if(s == sym_bang && !argc) { *************** *** 527,536 **** ret = call(str,0,s,argc,argv); } ! if(!ret) { ! // try tag at any inlet sprintf(str,"%s_",GetString(s)); ret = call(str,n,NULL,argc,argv); } ! if(!ret) { // try anything at any inlet const char *str1 = "_anything_"; --- 528,550 ---- ret = call(str,0,s,argc,argv); } ! ! // try int at any inlet ! if(!ret && isfloat && GetAFloat(argv[0]) == GetAInt(argv[0])) { ! ret = call("int_",0,NULL,1,argv); ! } ! ! // try tag at any inlet ! if(!ret) { sprintf(str,"%s_",GetString(s)); ret = call(str,n,NULL,argc,argv); } ! ! // try truncated int at any inlet ! if(!ret && isfloat) { ! t_atom at; SetInt(at,GetAInt(argv[0])); ! ret = call("int_",0,NULL,1,&at); ! } ! ! if(!ret) { // try anything at any inlet const char *str1 = "_anything_";
Index: py.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/py.cpp,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** py.cpp 9 Jan 2005 04:59:30 -0000 1.16 --- py.cpp 10 Jan 2005 05:00:56 -0000 1.17 *************** *** 26,30 **** bool work(const t_symbol *s,int argc,const t_atom *argv);
- void m_bang() { callwork(sym_bang,0,NULL); } void m_reload(); void m_reload_(int argc,const t_atom *argv); --- 26,29 ---- *************** *** 38,41 **** --- 37,41 ---- void callwork(const t_symbol *s,int argc,const t_atom *argv); + void m_bang() { callwork(sym_bang,0,NULL); } void m_py_list(int argc,const t_atom *argv) { callwork(sym_list,argc,argv); } void m_py_float(int argc,const t_atom *argv) { callwork(sym_float,argc,argv); } *************** *** 45,48 **** --- 45,49 ---- const t_symbol *funname; PyObject *function; + bool withfunction;
virtual void Reload(); *************** *** 103,107 ****
pyobj::pyobj(int argc,const t_atom *argv): ! function(NULL),funname(NULL) { PyThreadState *state = PyLock(); --- 104,108 ----
pyobj::pyobj(int argc,const t_atom *argv): ! function(NULL),funname(NULL),withfunction(false) { PyThreadState *state = PyLock(); *************** *** 131,139 **** AddToPath(GetString(canvas_getcurrentdir())); #elif FLEXT_SYS == FLEXT_SYS_MAX - /* short path = patcher_myvol(thisCanvas()); path_topathname(path,NULL,dir); AddToPath(dir); - */ #else #pragma message("Adding current dir to path is not implemented") --- 132,138 ---- *************** *** 147,150 **** --- 146,151 ----
if(argc >= 2) { + withfunction = true; + // set function name if(!IsString(argv[1])) *************** *** 155,158 **** --- 156,161 ---- } } + else + withfunction = false;
PyUnlock(state); *************** *** 281,288 **** if(func) { funname = MakeSymbol(func); ResetFunction(); } ! else function = NULL,funname = NULL; }
--- 284,294 ---- if(func) { funname = MakeSymbol(func); + withfunction = true; ResetFunction(); } ! else { ! withfunction = false; function = NULL,funname = NULL; + } }
*************** *** 320,336 **** bool ret = false;
! if(function) { ! PyThreadState *state = PyLock(); ! ! PyObject *pargs = MakePyArgs(s,argc,argv); ! Py_INCREF(function); ! ret = gencall(function,pargs);
! PyUnlock(state); } ! else { ! post("%s: no function defined",thisName()); ! ret = false; ! }
Respond(ret); --- 326,352 ---- bool ret = false;
! PyThreadState *state = PyLock();
! if(withfunction) { ! if(function) { ! PyObject *pargs = MakePyArgs(s,argc,argv); ! Py_INCREF(function); ! ret = gencall(function,pargs); ! } ! else ! post("%s: no valid function defined",thisName()); } ! else { ! // no function defined as creation argument -> use message tag ! PyObject *func = PyObject_GetAttrString(module,const_cast<char *>(GetString(s))); ! if(func) { ! PyObject *pargs = MakePyArgs(sym_list,argc,argv); ! ret = gencall(func,pargs); ! } ! else ! PyErr_Print(); ! } ! ! PyUnlock(state);
Respond(ret);
Index: main.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/main.cpp,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** main.cpp 9 Jan 2005 04:59:30 -0000 1.19 --- main.cpp 10 Jan 2005 05:00:56 -0000 1.20 *************** *** 20,30 ****
#ifdef FLEXT_THREADS typedef std::map<flext::thrid_t,PyThreadState *> PyThrMap;
! static PyInterpreterState *pystate = NULL; static PyThreadState *pythrmain = NULL; static PyThrMap pythrmap;
! PyThreadState *FindThreadState() { flext::thrid_t id = flext::GetThreadId(); --- 20,31 ----
#ifdef FLEXT_THREADS + typedef std::map<flext::thrid_t,PyThreadState *> PyThrMap;
! static PyInterpreterState *pymain = NULL; static PyThreadState *pythrmain = NULL; static PyThrMap pythrmap;
! PyThreadState *py::FindThreadState() { flext::thrid_t id = flext::GetThreadId(); *************** *** 32,36 **** if(it == pythrmap.end()) { // Make new thread state ! PyThreadState *st = PyThreadState_New(pystate); pythrmap[id] = st; return st; --- 33,37 ---- if(it == pythrmap.end()) { // Make new thread state ! PyThreadState *st = PyThreadState_New(pymain); pythrmap[id] = st; return st; *************** *** 40,44 **** }
! void FreeThreadState() { flext::thrid_t id = flext::GetThreadId(); --- 41,45 ---- }
! void py::FreeThreadState() { flext::thrid_t id = flext::GetThreadId(); *************** *** 59,71 **** { post(""); ! post("--------------------------------------"); post("py/pyext %s - python script objects",PY__VERSION); ! post(" (C)2002-2005 Thomas Grill"); ! post(" http://grrrr.org/ext"); #ifdef FLEXT_DEBUG post(""); post("DEBUG version compiled on %s %s",__DATE__,__TIME__); #endif ! post("--------------------------------------"); post("");
--- 60,73 ---- { post(""); ! post("------------------------------------------------"); post("py/pyext %s - python script objects",PY__VERSION); ! post("(C)2002-2005 Thomas Grill - http://grrrr.org/ext"); ! post(""); ! post("using Python %s",Py_GetVersion()); #ifdef FLEXT_DEBUG post(""); post("DEBUG version compiled on %s %s",__DATE__,__TIME__); #endif ! post("------------------------------------------------"); post("");
*************** *** 86,90 **** pythrmain = PyThreadState_Get(); // get main interpreter state ! pystate = pythrmain->interp;
// add thread state of main thread to map --- 88,92 ---- pythrmain = PyThreadState_Get(); // get main interpreter state ! pymain = pythrmain->interp;
// add thread state of main thread to map *************** *** 105,117 **** PySys_SetObject("stderr", py_out);
- #ifdef FLEXT_THREADS - // release global lock - PyEval_ReleaseLock(); - #endif - // -------------------------------------------------------------
FLEXT_SETUP(pyobj); FLEXT_SETUP(pyext); }
--- 107,119 ---- PySys_SetObject("stderr", py_out);
// -------------------------------------------------------------
FLEXT_SETUP(pyobj); FLEXT_SETUP(pyext); + + #ifdef FLEXT_THREADS + // release global lock + PyEval_ReleaseLock(); + #endif }
*************** *** 128,136 **** stoptick(0) { - // interpreter = PyInterpreterState_New(); - PyThreadState *state = PyLock(); Py_INCREF(module_obj); ! PyUnlock(state);
FLEXT_ADDTIMER(stoptmr,tick); --- 130,136 ---- stoptick(0) { PyThreadState *state = PyLock(); Py_INCREF(module_obj); ! PyUnlock(state);
FLEXT_ADDTIMER(stoptmr,tick); *************** *** 154,165 **** post("%s - Okay, all threads have terminated",thisName()); } ! Py_XDECREF(module_obj); ! /* ! PyEval_AcquireLock(); ! PyInterpreterState_Clear(interpreter); ! PyInterpreterState_Delete(interpreter); ! PyEval_ReleaseLock(); ! */ }
--- 154,161 ---- post("%s - Okay, all threads have terminated",thisName()); } ! ! PyThreadState *state = PyLock(); Py_XDECREF(module_obj); ! PyUnlock(state); }
*************** *** 506,515 **** --- 502,527 ---- Py_XDECREF(args); } + PyUnlock(state); }
+ #if FLEXT_SYS == FLEXT_SYS_MAX + short py::patcher_myvol(t_patcher *x) + { + t_box *w; + if (x->p_vol) + return x->p_vol; + else if (w = (t_box *)x->p_vnewobj) + return patcher_myvol(w->b_patcher); + else + return 0; + } + #endif + + Fifo::~Fifo() { FifoEl *el = head; + head = tail = NULL; // reset it, in case there's a thread wanting to Pop while(el) { FifoEl *n = el->nxt;
Index: main.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/main.h,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** main.h 9 Jan 2005 04:59:30 -0000 1.26 --- main.h 10 Jan 2005 05:00:56 -0000 1.27 *************** *** 59,65 ****
- PyThreadState *FindThreadState(); - void FreeThreadState(); - class py: public flext_base --- 59,62 ---- *************** *** 142,148 **** virtual bool callpy(PyObject *fun,PyObject *args) = 0;
! private: ! // PyInterpreterState *interpreter;
bool qucall(PyObject *fun,PyObject *args); void threadworker(); --- 139,147 ---- virtual bool callpy(PyObject *fun,PyObject *args) = 0;
! #if FLEXT_SYS == FLEXT_SYS_MAX ! static short patcher_myvol(t_patcher *x); ! #endif
+ private: bool qucall(PyObject *fun,PyObject *args); void threadworker(); *************** *** 158,161 **** --- 157,165 ---- #endif
+ #ifdef FLEXT_THREADS + static PyThreadState *FindThreadState(); + static void FreeThreadState(); + #endif + public: