diff options
Diffstat (limited to 'externals/grill/py/source/main.cpp')
-rw-r--r-- | externals/grill/py/source/main.cpp | 111 |
1 files changed, 49 insertions, 62 deletions
diff --git a/externals/grill/py/source/main.cpp b/externals/grill/py/source/main.cpp index e32b9ba8..aa234cc4 100644 --- a/externals/grill/py/source/main.cpp +++ b/externals/grill/py/source/main.cpp @@ -13,7 +13,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. static PyMethodDef StdOut_Methods[] = { - { "write", py::StdOut_Write, 1 }, + { "write", pybase::StdOut_Write, 1 }, { NULL, NULL, } }; @@ -27,9 +27,9 @@ static PyInterpreterState *pymain = NULL; static PyThreadState *pythrmain = NULL; static PyThrMap pythrmap; -int py::lockcount = 0; +int pybase::lockcount = 0; -PyThreadState *py::FindThreadState() +PyThreadState *pybase::FindThreadState() { flext::thrid_t id = flext::GetThreadId(); PyThrMap::iterator it = pythrmap.find(id); @@ -43,7 +43,7 @@ PyThreadState *py::FindThreadState() return it->second; } -void py::FreeThreadState() +void pybase::FreeThreadState() { flext::thrid_t id = flext::GetThreadId(); PyThrMap::iterator it = pythrmap.find(id); @@ -59,10 +59,16 @@ void py::FreeThreadState() #endif +PyObject *pybase::module_obj = NULL; +PyObject *pybase::module_dict = NULL; + +PyObject *pybase::emptytuple = NULL; + + void initsymbol(); void initsamplebuffer(); -void py::lib_setup() +void pybase::lib_setup() { post(""); post("------------------------------------------------"); @@ -137,10 +143,13 @@ void py::lib_setup() initsamplebuffer(); PyModule_AddObject(module_obj,"Buffer",(PyObject *)&pySamplebuffer_Type); + emptytuple = PyTuple_New(0); + // ------------------------------------------------------------- FLEXT_SETUP(pyobj); FLEXT_SETUP(pyext); + FLEXT_DSP_SETUP(pydsp); #ifdef FLEXT_THREADS // release global lock @@ -151,24 +160,10 @@ void py::lib_setup() post(""); } -FLEXT_LIB_SETUP(py,py::lib_setup) +FLEXT_LIB_SETUP(py,pybase::lib_setup) -PyObject *py::module_obj = NULL; -PyObject *py::module_dict = NULL; - - -void py::Setup(t_classid c) -{ - FLEXT_CADDMETHOD_(c,0,"doc",m_doc); - FLEXT_CADDMETHOD_(c,0,"dir",m_dir); -#ifdef FLEXT_THREADS - FLEXT_CADDATTR_VAR1(c,"detach",detach); - FLEXT_CADDMETHOD_(c,0,"stop",m_stop); -#endif -} - -py::py() +pybase::pybase() : module(NULL),detach(0) #ifdef FLEXT_THREADS , shouldexit(false),thrcount(0),stoptick(0) @@ -177,23 +172,16 @@ py::py() PyThreadState *state = PyLock(); Py_INCREF(module_obj); PyUnlock(state); - -#ifdef FLEXT_THREADS - FLEXT_ADDTIMER(stoptmr,tick); - - // launch thread worker - FLEXT_CALLMETHOD(threadworker); -#endif } -py::~py() +pybase::~pybase() { PyThreadState *state = PyLock(); Py_XDECREF(module_obj); PyUnlock(state); } -void py::Exit() +void pybase::Exit() { #ifdef FLEXT_THREADS shouldexit = true; @@ -204,16 +192,15 @@ void py::Exit() Sleep(PY_STOP_TICK*0.001f); if(thrcount) { // Wait forever - post("%s - Waiting for thread termination!",thisName()); + post("py/pyext - Waiting for thread termination!"); while(thrcount) Sleep(PY_STOP_TICK*0.001f); - post("%s - Okay, all threads have terminated",thisName()); + post("py/pyext - Okay, all threads have terminated"); } } #endif - flext_base::Exit(); } -void py::GetDir(PyObject *obj,AtomList &lst) +void pybase::GetDir(PyObject *obj,AtomList &lst) { if(obj) { PyThreadState *state = PyLock(); @@ -227,7 +214,7 @@ void py::GetDir(PyObject *obj,AtomList &lst) lst = *l; delete l; } else - post("%s - %s: List could not be created",thisName(),GetString(thisTag())); + post("py/pyext - Argument list could not be created"); Py_DECREF(pvar); } @@ -235,15 +222,15 @@ void py::GetDir(PyObject *obj,AtomList &lst) } } -void py::m__dir(PyObject *obj) +void pybase::m__dir(PyObject *obj) { AtomList lst; GetDir(obj,lst); // dump dir to attribute outlet - ToOutAnything(GetOutAttr(),thisTag(),lst.Count(),lst.Atoms()); + DumpOut(NULL,lst.Count(),lst.Atoms()); } -void py::m__doc(PyObject *obj) +void pybase::m__doc(PyObject *obj) { if(obj) { PyThreadState *state = PyLock(); @@ -279,19 +266,19 @@ void py::m__doc(PyObject *obj) } } -void py::m_click() +void pybase::OpenEditor() { // this should once open the editor.... } -void py::SetArgs(int argc,const t_atom *argv) +void pybase::SetArgs(int argc,const t_atom *argv) { // script arguments char **sargv = new char *[argc+1]; for(int i = 0; i <= argc; ++i) { sargv[i] = new char[256]; if(!i) - strcpy(sargv[i],thisName()); + strcpy(sargv[i],"py/pyext"); else GetAString(argv[i-1],sargv[i],255); } @@ -303,7 +290,7 @@ void py::SetArgs(int argc,const t_atom *argv) delete[] sargv; } -void py::ImportModule(const char *name) +void pybase::ImportModule(const char *name) { if(!name) return; @@ -316,7 +303,7 @@ void py::ImportModule(const char *name) dict = PyModule_GetDict(module); } -void py::UnimportModule() +void pybase::UnimportModule() { if(!module) return; @@ -332,7 +319,7 @@ void py::UnimportModule() dict = NULL; } -void py::ReloadModule() +void pybase::ReloadModule() { if(module) { PyObject *newmod = PyImport_ReloadModule(module); @@ -348,10 +335,10 @@ void py::ReloadModule() } } else - post("%s - No module to reload",thisName()); + post("py/pyext - No module to reload"); } -void py::GetModulePath(const char *mod,char *dir,int len) +void pybase::GetModulePath(const char *mod,char *dir,int len) { #if FLEXT_SYS == FLEXT_SYS_PD // uarghh... pd doesn't show its path for extra modules @@ -394,7 +381,7 @@ void py::GetModulePath(const char *mod,char *dir,int len) #endif } -void py::AddToPath(const char *dir) +void pybase::AddToPath(const char *dir) { if(dir && *dir) { PyObject *pobj = PySys_GetObject("path"); @@ -410,12 +397,12 @@ void py::AddToPath(const char *dir) static const t_symbol *sym_response = flext::MakeSymbol("response"); -void py::Respond(bool b) +void pybase::Respond(bool b) { if(respond) { t_atom a; SetBool(a,b); - ToOutAnything(GetOutAttr(),sym_response,1,&a); + DumpOut(sym_response,1,&a); } } @@ -424,7 +411,7 @@ void py::Respond(bool b) static PyObject *output = NULL; // post to the console -PyObject* py::StdOut_Write(PyObject* self, PyObject* args) +PyObject* pybase::StdOut_Write(PyObject* self, PyObject* args) { // should always be a tuple FLEXT_ASSERT(PyTuple_Check(args)); @@ -475,7 +462,7 @@ public: PyObject *fun,*args; }; -bool py::gencall(PyObject *pmeth,PyObject *pargs) +bool pybase::gencall(PyObject *pmeth,PyObject *pargs) { bool ret = false; @@ -494,18 +481,18 @@ bool py::gencall(PyObject *pmeth,PyObject *pargs) case 2: // each call a new thread if(!shouldexit) { - ret = FLEXT_CALLMETHOD_X(work_wrapper,new work_data(pmeth,pargs)); - if(!ret) post("%s - Failed to launch thread!",thisName()); + ret = thrcall(new work_data(pmeth,pargs)); + if(!ret) post("py/pyext - Failed to launch thread!"); } break; #endif default: - post("%s - Unknown detach mode",thisName()); + post("py/pyext - Unknown detach mode"); } return ret; } -void py::work_wrapper(void *data) +void pybase::work_wrapper(void *data) { FLEXT_ASSERT(data); @@ -528,7 +515,7 @@ void py::work_wrapper(void *data) } #ifdef FLEXT_THREADS -bool py::qucall(PyObject *fun,PyObject *args) +bool pybase::qucall(PyObject *fun,PyObject *args) { FifoEl *el = qufifo.New(); el->Set(fun,args); @@ -537,7 +524,7 @@ bool py::qucall(PyObject *fun,PyObject *args) return true; } -void py::threadworker() +void pybase::threadworker() { FifoEl *el; PyThreadState *state; @@ -573,7 +560,7 @@ void py::threadworker() #endif #if FLEXT_SYS == FLEXT_SYS_MAX -short py::patcher_myvol(t_patcher *x) +short pybase::patcher_myvol(t_patcher *x) { t_box *w; if (x->p_vol) @@ -585,12 +572,12 @@ short py::patcher_myvol(t_patcher *x) } #endif -bool py::collect() +bool pybase::collect() { if(gcollect) { - PyObject *args = PyTuple_New(0); - PyObject *ret = PyObject_Call(gcollect,args,NULL); - Py_DECREF(args); + Py_INCREF(emptytuple); + PyObject *ret = PyObject_Call(gcollect,emptytuple,NULL); + Py_DECREF(emptytuple); if(ret) { #ifdef FLEXT_DEBUG int refs = PyInt_AsLong(ret); |