diff options
author | Thomas Grill <xovo@users.sourceforge.net> | 2005-07-08 14:30:31 +0000 |
---|---|---|
committer | Thomas Grill <xovo@users.sourceforge.net> | 2005-07-08 14:30:31 +0000 |
commit | 897b80c5585f7c9031ff1aafb504c21a9d3b1606 (patch) | |
tree | eaab38174de9e018827634ed079a885e232097a4 /externals/grill/py/source/main.h | |
parent | 6efb16b9040f7ba6db8c60559e0c815d54f05c43 (diff) |
better reload handling, but still far fom perfect
fixed minor other issues
cleaned up float vs. int pyext tags
simplifications in py and pyext
bumped version number
python-like dotted module.function syntax
send and receive wrapped PyObjects through inlets/outlets
multiply inlets for py (hot and cold inlets)
svn path=/trunk/; revision=3308
Diffstat (limited to 'externals/grill/py/source/main.h')
-rw-r--r-- | externals/grill/py/source/main.h | 197 |
1 files changed, 1 insertions, 196 deletions
diff --git a/externals/grill/py/source/main.h b/externals/grill/py/source/main.h index 0b94274e..479c082d 100644 --- a/externals/grill/py/source/main.h +++ b/externals/grill/py/source/main.h @@ -12,20 +12,8 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define __MAIN_H #include "pyprefix.h" -#include "pysymbol.h" -#include "pybuffer.h" -#include <flcontainers.h> -#include <string> -#if FLEXT_OS == FLEXT_LINUX || FLEXT_OS == FLEXT_IRIX -#include <unistd.h> -#endif - -#if FLEXT_SYS == FLEXT_SYS_PD && (!defined (PD_MINOR_VERSION) || PD_MINOR_VERSION < 37) -#error PD version >= 0.37 required, please upgrade! -#endif - -#define PY__VERSION "0.2.0" +#define PY__VERSION "0.2.1pre" #define PYEXT_MODULE "pyext" // name for module @@ -37,7 +25,6 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define PY_STOP_TICK 1 // ms - class FifoEl : public Fifo::Cell { @@ -48,186 +35,4 @@ public: typedef PooledFifo<FifoEl> PyFifo; - -class pybase - : public flext -{ -public: - pybase(); - virtual ~pybase(); - - void Exit(); - - static PyObject *MakePyArgs(const t_symbol *s,int argc,const t_atom *argv,int inlet = -1,bool withself = false); - static bool GetPyArgs(AtomList &lst,PyObject *pValue,int offs = 0,PyObject **self = NULL); - - static void lib_setup(); - -protected: - - virtual void DumpOut(const t_symbol *sym,int argc,const t_atom *argv) = 0; - - void m__dir(PyObject *obj); - void m__doc(PyObject *obj); - - void m_dir() { m__dir(module); } - void mg_dir(AtomList &lst) { m__dir(module); } - void m_doc() { m__doc(dict); } - - std::string modname; // module name - PyObject *module,*dict; // object module and associated dictionary - - static const char *py_doc; - - void GetDir(PyObject *obj,AtomList &lst); - - AtomListStatic<16> args; - - void GetModulePath(const char *mod,char *dir,int len); - void AddToPath(const char *dir); - void SetArgs(); - - // reload module and all connected objects - void Reload(); - - bool ImportModule(const char *name); - void UnimportModule(); - bool ReloadModule(); - - // Get module registry - PyObject *GetRegistry(const char *regname); - // Set module registry - void SetRegistry(const char *regname,PyObject *reg); - - // Register object - void Register(PyObject *reg); - // Unregister object - void Unregister(PyObject *reg); - - virtual void LoadModule() = 0; - virtual void UnloadModule() = 0; - - virtual void Load() = 0; - virtual void Unload() = 0; - - void OpenEditor(); - void Respond(bool b); - - void Report() { while(PyErr_Occurred()) PyErr_Print(); } - - static bool IsAnything(const t_symbol *s) { return s && s != sym_float && s != sym_int && s != sym_symbol && s != sym_list && s != sym_pointer; } - - enum retval { nothing,atom,sequ }; - - // --- module stuff ----- - - static PyObject *module_obj,*module_dict; - static PyMethodDef func_tbl[]; - - static PyObject *py__doc__(PyObject *,PyObject *args); - static PyObject *py_send(PyObject *,PyObject *args); -#ifdef FLEXT_THREADS - static PyObject *py_priority(PyObject *,PyObject *args); -#endif - - static PyObject *py_arraysupport(PyObject *,PyObject *args); - static PyObject *py_samplerate(PyObject *,PyObject *args); - static PyObject *py_blocksize(PyObject *,PyObject *args); - -#if FLEXT_SYS == FLEXT_SYS_PD - static PyObject *py_getvalue(PyObject *,PyObject *args); - static PyObject *py_setvalue(PyObject *,PyObject *args); -#endif - -#ifdef PY_NUMARRAY - static void setupNumarray(); - static PyObject *py_import(PyObject *,PyObject *args); - static PyObject *py_export(PyObject *,PyObject *args); -#endif - - // ----thread stuff ------------ - - virtual void m_stop(int argc,const t_atom *argv); - - bool respond; -#ifdef FLEXT_THREADS - bool shouldexit; - int thrcount; - int stoptick; - Timer stoptmr; - - void tick(void *); -#endif - - int detach; - - bool gencall(PyObject *fun,PyObject *args); - virtual bool thrcall(void *data) = 0; - virtual bool callpy(PyObject *fun,PyObject *args) = 0; - -#if FLEXT_SYS == FLEXT_SYS_MAX - static short patcher_myvol(t_patcher *x); -#endif - - static bool collect(); - -protected: - - void work_wrapper(void *data); - -#ifdef FLEXT_THREADS - bool qucall(PyObject *fun,PyObject *args); - void threadworker(); - PyFifo qufifo; - ThrCond qucond; - static PyThreadState *pythrsys; - - static PyThreadState *FindThreadState(); - static void FreeThreadState(); -#else - static PyThreadState *FindThreadState() { return NULL; } -#endif - -public: - -#ifdef FLEXT_THREADS - ThrMutex mutex; - inline void Lock() { mutex.Unlock(); } - inline void Unlock() { mutex.Unlock(); } - - // this is especially needed when one py/pyext object calls another one - // we don't want the message to be queued, but otoh we have to avoid deadlock - // (recursive calls can only happen in the system thread) - static int lockcount; - - static PyThreadState *PyLock(PyThreadState *st = FindThreadState()) - { - if(!IsSystemThread() || !lockcount++) PyEval_AcquireLock(); - return PyThreadState_Swap(st); - } - - static PyThreadState *PyLockSys() - { - if(!lockcount++) PyEval_AcquireLock(); - return PyThreadState_Swap(pythrsys); - } - - static void PyUnlock(PyThreadState *st) - { - PyThreadState *old = PyThreadState_Swap(st); - if(old != pythrsys || !--lockcount) PyEval_ReleaseLock(); - } - -#else - inline void Lock() {} - inline void Unlock() {} - - static PyThreadState *PyLock(PyThreadState * = NULL) { return NULL; } - static PyThreadState *PyLockSys() { return NULL; } - static void PyUnlock(PyThreadState *st) {} -#endif - - static PyObject* StdOut_Write(PyObject* Self, PyObject* Args); -}; - #endif |