[PD-cvs] externals/grill/py/source main.cpp,1.30,1.31 main.h,1.36,1.37 py.cpp,1.20,1.21 pybuffer.cpp,1.3,1.4 pydsp.cpp,1.1,1.2 pyext.cpp,1.29,1.30

Thomas Grill xovo at users.sourceforge.net
Mon Mar 14 05:58:15 CET 2005


Update of /cvsroot/pure-data/externals/grill/py/source
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18952/source

Modified Files:
	main.cpp main.h py.cpp pybuffer.cpp pydsp.cpp pyext.cpp 
Log Message:
fixes for OSX
docs
optimizations and fixes
use optimized version
optimized function calls
adjust pd and py files for correct argument passing
more optimizations


Index: pybuffer.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/pybuffer.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** pybuffer.cpp	13 Mar 2005 04:59:47 -0000	1.3
--- pybuffer.cpp	14 Mar 2005 04:58:13 -0000	1.4
***************
*** 12,16 ****
--- 12,20 ----
  
  #ifdef PY_NUMARRAY
+ #if FLEXT_OS == FLEXT_OS_MAC
+ #include <Python/numarray/numarray.h>
+ #else
  #include <numarray/numarray.h>
+ #endif
  static bool nasupport = false;
  static NumarrayType numtype;
***************
*** 19,24 ****
  // PD defines a T_OBJECT symbol
  #undef T_OBJECT
! #include "structmember.h"
  #include "bufferobject.h"
  
  static PyObject *buffer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
--- 23,34 ----
  // PD defines a T_OBJECT symbol
  #undef T_OBJECT
! 
! #if FLEXT_OS == FLEXT_OS_MAC
! #include "Python/bufferobject.h"
! #include "Python/structmember.h"
! #else
  #include "bufferobject.h"
+ #include "structmember.h"
+ #endif
  
  static PyObject *buffer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)

Index: pydsp.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/pydsp.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** pydsp.cpp	13 Mar 2005 04:59:47 -0000	1.1
--- pydsp.cpp	14 Mar 2005 04:58:13 -0000	1.2
***************
*** 27,31 ****
      virtual PyObject *GetSig(int ix,bool in);
  
!     void NewBuffers(bool update = false);
      void FreeBuffers();
  
--- 27,31 ----
      virtual PyObject *GetSig(int ix,bool in);
  
!     void NewBuffers();
      void FreeBuffers();
  
***************
*** 47,52 ****
      if(pyobj) 
  	{ 
-         NewBuffers();
- 
          dspfun = PyObject_GetAttrString(pyobj,"_dsp"); // get ref
  	    if(dspfun && !PyMethod_Check(dspfun)) {
--- 47,50 ----
***************
*** 54,62 ****
  		    dspfun = NULL;
  	    }
-         sigfun = PyObject_GetAttrString(pyobj,"_signal"); // get ref
- 	    if(sigfun && !PyMethod_Check(sigfun)) {
-             Py_DECREF(sigfun);
- 		    sigfun = NULL;
- 	    }
  	}
      return true;
--- 52,55 ----
***************
*** 73,77 ****
  PyObject *NAFromBuffer(PyObject *buf,int c,int n);
  
! void pydsp::NewBuffers(bool update)
  {
      int i,n = Blocksize();
--- 66,70 ----
  PyObject *NAFromBuffer(PyObject *buf,int c,int n);
  
! void pydsp::NewBuffers()
  {
      int i,n = Blocksize();
***************
*** 80,93 ****
      t_sample *const *outsigs = OutSig();
  
      if(!buffers) {
          int cnt = ins+outs;
!         if(cnt) {
!             buffers = new PyObject *[cnt];
!             memset(buffers,0,cnt*sizeof(*buffers));
!         }
      }
  
      for(i = 0; i < ins; ++i) {
!         if(update) Py_XDECREF(buffers[i]);
          PyObject *b = PyBuffer_FromReadWriteMemory(insigs[i],n*sizeof(t_sample));
          buffers[i] = NAFromBuffer(b,1,n);
--- 73,85 ----
      t_sample *const *outsigs = OutSig();
  
+     // inlet/outlet count can't change so we don't have to deallocate
      if(!buffers) {
          int cnt = ins+outs;
!         buffers = new PyObject *[cnt];
!         memset(buffers,0,cnt*sizeof(*buffers));
      }
  
      for(i = 0; i < ins; ++i) {
!         Py_XDECREF(buffers[i]);
          PyObject *b = PyBuffer_FromReadWriteMemory(insigs[i],n*sizeof(t_sample));
          buffers[i] = NAFromBuffer(b,1,n);
***************
*** 95,99 ****
      }
      for(i = 0; i < outs; ++i) {
!         if(update) Py_XDECREF(buffers[ins+i]);
          if(i < ins && outsigs[i] == insigs[i]) {
              // same vectors - share the objects!
--- 87,91 ----
      }
      for(i = 0; i < outs; ++i) {
!         Py_XDECREF(buffers[ins+i]);
          if(i < ins && outsigs[i] == insigs[i]) {
              // same vectors - share the objects!
***************
*** 121,133 ****
  bool pydsp::CbDsp()
  {
!     if(CntInSig() || CntOutSig())
      {
!         NewBuffers(true);
  
          if(dspfun) {
!         	PyThreadState *state = PyLock();
! //            Py_INCREF(emptytuple);
!             PyObject *ret = PyObject_Call(dspfun,emptytuple,NULL);
! //            Py_DECREF(emptytuple);
              if(ret)
                  Py_DECREF(ret);
--- 113,124 ----
  bool pydsp::CbDsp()
  {
!     if(pyobj && (CntInSig() || CntOutSig()))
      {
!        	PyThreadState *state = PyLockSys();
! 
!         NewBuffers();
  
          if(dspfun) {
!             PyObject *ret = PyObject_CallObject(dspfun,NULL);
              if(ret)
                  Py_DECREF(ret);
***************
*** 139,145 ****
  #endif   
              }
-             PyUnlock(state);
          }
!         return true;
      }
      else
--- 130,147 ----
  #endif   
              }
          }
! 
!         // do that here instead of where dspfun is initialized, so that
!         // _signal can be assigned in _dsp
!         // optimizations may be done there to assign the right _signal version
!         Py_XDECREF(sigfun);
!         sigfun = PyObject_GetAttrString(pyobj,"_signal"); // get ref
! 	    if(sigfun && !PyMethod_Check(sigfun)) {
!             Py_DECREF(sigfun);
! 		    sigfun = NULL;
! 	    }
! 
!         PyUnlock(state);
!         return sigfun != NULL;
      }
      else
***************
*** 150,172 ****
  void pydsp::CbSignal()
  {
!     if(sigfun) {
!       	PyThreadState *state = PyLock();
! //        Py_INCREF(emptytuple);
!         PyObject *ret = PyObject_Call(sigfun,emptytuple,NULL);
! //        Py_DECREF(emptytuple);
  
!         if(ret) 
!             Py_DECREF(ret);
!         else {
  #ifdef FLEXT_DEBUG
!             PyErr_Print();
  #else
!             PyErr_Clear();
  #endif   
-         }
-         PyUnlock(state);
      }
!     else
!         flext_dsp::CbSignal();
  }
  
--- 152,168 ----
  void pydsp::CbSignal()
  {
!     PyThreadState *state = PyLockSys();
!     PyObject *ret = PyObject_CallObject(sigfun,NULL);
  
!     if(ret) 
!         Py_DECREF(ret);
!     else {
  #ifdef FLEXT_DEBUG
!         PyErr_Print();
  #else
!         PyErr_Clear();
  #endif   
      }
!     PyUnlock(state);
  }
  

Index: main.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/main.h,v
retrieving revision 1.36
retrieving revision 1.37
diff -C2 -d -r1.36 -r1.37
*** main.h	13 Mar 2005 04:59:47 -0000	1.36
--- main.h	14 Mar 2005 04:58:13 -0000	1.37
***************
*** 93,98 ****
  	enum retval { nothing,atom,sequ };
  
-     static PyObject *emptytuple;
- 
  	// --- module stuff -----
  
--- 93,96 ----
***************
*** 155,161 ****
--- 153,162 ----
      PyFifo qufifo;
      ThrCond qucond;
+     static PyThreadState *pythrsys;
  
      static PyThreadState *FindThreadState();
      static void FreeThreadState();
+ #else
+     static PyThreadState *FindThreadState() { return NULL; }
  #endif
  
***************
*** 167,191 ****
  	inline void Unlock() { mutex.Unlock(); }
  
!     // this is respecially 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;
  
! 	inline PyThreadState *PyLock() 
      { 
          if(!IsSystemThread() || !lockcount++) PyEval_AcquireLock();
! 	    return PyThreadState_Swap(FindThreadState());
      }
  
  	inline void PyUnlock(PyThreadState *st) 
      {
!         PyThreadState_Swap(st);
!         if(!IsSystemThread() || !--lockcount) PyEval_ReleaseLock();
      }
  #else
  	inline void Lock() {}
  	inline void Unlock() {}
  
! 	inline PyThreadState *PyLock() { return NULL; }
  	inline void PyUnlock(PyThreadState *st) {}
  #endif
--- 168,200 ----
  	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;
  
! 	inline PyThreadState *PyLock(PyThreadState *st = FindThreadState()) 
      { 
          if(!IsSystemThread() || !lockcount++) PyEval_AcquireLock();
! 	    return PyThreadState_Swap(st);
!     }
! 
! 	inline PyThreadState *PyLockSys() 
!     { 
!         if(!lockcount++) PyEval_AcquireLock();
! 	    return PyThreadState_Swap(pythrsys);
      }
  
  	inline void PyUnlock(PyThreadState *st) 
      {
!         PyThreadState *old = PyThreadState_Swap(st);
!         if(old != pythrsys || !--lockcount) PyEval_ReleaseLock();
      }
+ 
  #else
  	inline void Lock() {}
  	inline void Unlock() {}
  
! 	inline PyThreadState *PyLock(PyThreadState *) { return NULL; }
! 	inline PyThreadState *PyLockSys() { return NULL; }
  	inline void PyUnlock(PyThreadState *st) {}
  #endif

Index: pyext.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/pyext.cpp,v
retrieving revision 1.29
retrieving revision 1.30
diff -C2 -d -r1.29 -r1.30
*** pyext.cpp	13 Mar 2005 04:59:47 -0000	1.29
--- pyext.cpp	14 Mar 2005 04:58:13 -0000	1.30
***************
*** 132,136 ****
      const t_atom *clname = NULL;
  
!     PyThreadState *state = PyLock();
  
  	// init script module
--- 132,136 ----
      const t_atom *clname = NULL;
  
!     PyThreadState *state = PyLockSys();
  
  	// init script module
***************
*** 189,193 ****
  bool pyext::Init()
  {
! 	PyThreadState *state = PyLock();
  
  	if(methname) {
--- 189,193 ----
  bool pyext::Init()
  {
! 	PyThreadState *state = PyLockSys();
  
  	if(methname) {
***************
*** 216,220 ****
      pybase::Exit(); // exit threads
  
! 	PyThreadState *state = PyLock();
      DoExit();
      Unregister("_pyext");
--- 216,220 ----
      pybase::Exit(); // exit threads
  
! 	PyThreadState *state = PyLockSys();
      DoExit();
      Unregister("_pyext");
***************
*** 260,265 ****
          PyObject *objdel = PyObject_GetAttrString(pyobj,"_del");
          if(objdel) {
!             Py_INCREF(emptytuple);
!             PyObject *ret = PyObject_Call(objdel,emptytuple,NULL);
              if(ret)
                  Py_DECREF(ret);
--- 260,264 ----
          PyObject *objdel = PyObject_GetAttrString(pyobj,"_del");
          if(objdel) {
!             PyObject *ret = PyObject_CallObject(objdel,NULL);
              if(ret)
                  Py_DECREF(ret);
***************
*** 268,272 ****
                  post("%s - Could not call _del method",thisName());
  #endif
-             Py_DECREF(emptytuple);
              Py_DECREF(objdel);
          }
--- 267,270 ----
***************
*** 382,386 ****
  void pyext::m_reload()
  {
! 	PyThreadState *state = PyLock();
  
  	Unregister("_pyext"); // self
--- 380,384 ----
  void pyext::m_reload()
  {
! 	PyThreadState *state = PyLockSys();
  
  	Unregister("_pyext"); // self
***************
*** 404,408 ****
  void pyext::m_get(const t_symbol *s)
  {
!     PyThreadState *state = PyLock();
  
  	PyObject *pvar  = PyObject_GetAttrString(pyobj,const_cast<char *>(GetString(s))); /* fetch bound method */
--- 402,406 ----
  void pyext::m_get(const t_symbol *s)
  {
!     PyThreadState *state = PyLockSys();
  
  	PyObject *pvar  = PyObject_GetAttrString(pyobj,const_cast<char *>(GetString(s))); /* fetch bound method */
***************
*** 432,436 ****
  void pyext::m_set(int argc,const t_atom *argv)
  {
!     PyThreadState *state = PyLock();
  
      if(argc < 2 || !IsString(argv[0]))
--- 430,434 ----
  void pyext::m_set(int argc,const t_atom *argv)
  {
!     PyThreadState *state = PyLockSys();
  
      if(argc < 2 || !IsString(argv[0]))
***************
*** 507,511 ****
  bool pyext::callpy(PyObject *fun,PyObject *args)
  {
!     PyObject *ret = PyObject_Call(fun,args,NULL);
      if(ret == NULL) {
          // function not found resp. arguments not matching
--- 505,509 ----
  bool pyext::callpy(PyObject *fun,PyObject *args)
  {
!     PyObject *ret = PyObject_CallObject(fun,args);
      if(ret == NULL) {
          // function not found resp. arguments not matching

Index: main.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/main.cpp,v
retrieving revision 1.30
retrieving revision 1.31
diff -C2 -d -r1.30 -r1.31
*** main.cpp	13 Mar 2005 04:59:47 -0000	1.30
--- main.cpp	14 Mar 2005 04:58:13 -0000	1.31
***************
*** 25,30 ****
  
  static PyInterpreterState *pymain = NULL;
- static PyThreadState *pythrmain = NULL;
  static PyThrMap pythrmap;
  
  int pybase::lockcount = 0;
--- 25,30 ----
  
  static PyInterpreterState *pymain = NULL;
  static PyThrMap pythrmap;
+ PyThreadState *pybase::pythrsys = NULL;
  
  int pybase::lockcount = 0;
***************
*** 63,68 ****
  PyObject *pybase::module_dict = NULL;
  
- PyObject *pybase::emptytuple = NULL;
- 
  
  void initsymbol();
--- 63,66 ----
***************
*** 96,105 ****
  
      // get thread state
!     pythrmain = PyThreadState_Get();
      // get main interpreter state
! 	pymain = pythrmain->interp;
  
      // add thread state of main thread to map
!     pythrmap[GetThreadId()] = pythrmain;
  #endif
  
--- 94,103 ----
  
      // get thread state
!     pythrsys = PyThreadState_Get();
      // get main interpreter state
! 	pymain = pythrsys->interp;
  
      // add thread state of main thread to map
!     pythrmap[GetThreadId()] = pythrsys;
  #endif
  
***************
*** 144,149 ****
      PyModule_AddObject(module_obj,"Buffer",(PyObject *)&pySamplebuffer_Type);
  
-     emptytuple = PyTuple_New(0);
- 
  	// -------------------------------------------------------------
  
--- 142,145 ----
***************
*** 170,174 ****
  #endif
  {
!     PyThreadState *state = PyLock();
  	Py_INCREF(module_obj);
      PyUnlock(state);
--- 166,170 ----
  #endif
  {
!     PyThreadState *state = PyLockSys();
  	Py_INCREF(module_obj);
      PyUnlock(state);
***************
*** 177,181 ****
  pybase::~pybase()
  {
!     PyThreadState *state = PyLock();
     	Py_XDECREF(module_obj);
      PyUnlock(state);
--- 173,177 ----
  pybase::~pybase()
  {
!     PyThreadState *state = PyLockSys();
     	Py_XDECREF(module_obj);
      PyUnlock(state);
***************
*** 528,532 ****
  {
      FifoEl *el;
!     PyThreadState *state;
  
     	++thrcount;
--- 524,528 ----
  {
      FifoEl *el;
!     PyThreadState *my = FindThreadState(),*state;
  
     	++thrcount;
***************
*** 534,538 ****
          while(el = qufifo.Get()) {
          	++thrcount;
!             state = PyLock();
              callpy(el->fun,el->args);
              Py_XDECREF(el->fun);
--- 530,534 ----
          while(el = qufifo.Get()) {
          	++thrcount;
!             state = PyLock(my);
              callpy(el->fun,el->args);
              Py_XDECREF(el->fun);
***************
*** 548,552 ****
      }
  
!     state = PyLock();
      // unref remaining Python objects
      while(el = qufifo.Get()) {
--- 544,548 ----
      }
  
!     state = PyLock(my);
      // unref remaining Python objects
      while(el = qufifo.Get()) {
***************
*** 576,582 ****
  {
      if(gcollect) {
!         Py_INCREF(emptytuple);
!         PyObject *ret = PyObject_Call(gcollect,emptytuple,NULL);
!         Py_DECREF(emptytuple);
          if(ret) {
  #ifdef FLEXT_DEBUG
--- 572,576 ----
  {
      if(gcollect) {
!         PyObject *ret = PyObject_CallObject(gcollect,NULL);
          if(ret) {
  #ifdef FLEXT_DEBUG

Index: py.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/py.cpp,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** py.cpp	13 Mar 2005 04:59:47 -0000	1.20
--- py.cpp	14 Mar 2005 04:58:13 -0000	1.21
***************
*** 134,138 ****
  #endif
  
! 	PyThreadState *state = PyLock();
  
  	if(argc > 2) 
--- 134,138 ----
  #endif
  
! 	PyThreadState *state = PyLockSys();
  
  	if(argc > 2) 
***************
*** 189,193 ****
  pyobj::~pyobj() 
  {
! 	PyThreadState *state = PyLock();
  	Unregister("_py");
  	PyUnlock(state);
--- 189,193 ----
  pyobj::~pyobj() 
  {
! 	PyThreadState *state = PyLockSys();
  	Unregister("_py");
  	PyUnlock(state);
***************
*** 209,213 ****
  void pyobj::m_reload()
  {
! 	PyThreadState *state = PyLock();
  
  	Unregister("_py");
--- 209,213 ----
  void pyobj::m_reload()
  {
! 	PyThreadState *state = PyLockSys();
  
  	Unregister("_py");
***************
*** 223,227 ****
  void pyobj::m_reload_(int argc,const t_atom *argv)
  {
! 	PyThreadState *state = PyLock();
  	SetArgs(argc,argv);
  	PyUnlock(state);
--- 223,227 ----
  void pyobj::m_reload_(int argc,const t_atom *argv)
  {
! 	PyThreadState *state = PyLockSys();
  	SetArgs(argc,argv);
  	PyUnlock(state);
***************
*** 232,236 ****
  void pyobj::m_set(int argc,const t_atom *argv)
  {
! 	PyThreadState *state = PyLock();
  
  	int ix = 0;
--- 232,236 ----
  void pyobj::m_set(int argc,const t_atom *argv)
  {
! 	PyThreadState *state = PyLockSys();
  
  	int ix = 0;
***************
*** 329,333 ****
  bool pyobj::callpy(PyObject *fun,PyObject *args)
  {
!     PyObject *ret = PyObject_Call(fun,args,NULL); 
      if(ret == NULL) {
          // function not found resp. arguments not matching
--- 329,333 ----
  bool pyobj::callpy(PyObject *fun,PyObject *args)
  {
!     PyObject *ret = PyObject_CallObject(fun,args); 
      if(ret == NULL) {
          // function not found resp. arguments not matching





More information about the Pd-cvs mailing list