[PD-cvs] externals/grill/py/source clmeth.cpp,1.14,1.15 main.cpp,1.26,1.27 main.h,1.33,1.34 modmeth.cpp,1.14,1.15

Thomas Grill xovo at users.sourceforge.net
Tue Mar 8 05:59:27 CET 2005


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

Modified Files:
	clmeth.cpp main.cpp main.h modmeth.cpp 
Log Message:
pass timeout argument to stop method
fixes for detached mode
fixes for detached operation and single-threaded version
use lock count instead of message queuing to avoid py->py messaging deadlock
use new flext fifo


Index: modmeth.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/modmeth.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -C2 -d -r1.14 -r1.15
*** modmeth.cpp	11 Jan 2005 04:59:27 -0000	1.14
--- modmeth.cpp	8 Mar 2005 04:59:25 -0000	1.15
***************
*** 46,50 ****
  
  
! 
  void py::tick(void *)
  {
--- 46,50 ----
  
  
! #ifdef FLEXT_THREADS
  void py::tick(void *)
  {
***************
*** 69,75 ****
--- 69,77 ----
  	Unlock();
  }
+ #endif
  
  void py::m_stop(int argc,const t_atom *argv)
  {
+ #ifdef FLEXT_THREADS
  	if(thrcount) {
  		Lock();
***************
*** 90,94 ****
  		Unlock();
  	}
! 		
  }
  
--- 92,96 ----
  		Unlock();
  	}
! #endif		
  }
  

Index: clmeth.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/clmeth.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -C2 -d -r1.14 -r1.15
*** clmeth.cpp	27 Feb 2005 04:57:30 -0000	1.14
--- clmeth.cpp	8 Mar 2005 04:59:23 -0000	1.15
***************
*** 114,117 ****
--- 114,118 ----
      }
  
+ #ifdef FLEXT_THREADS
      if(PyString_Check(name)) {
  	    char* sname = PyString_AS_STRING(name);
***************
*** 125,128 ****
--- 126,130 ----
  		}
  	}
+ #endif
  
  	if(!ret) { 
***************
*** 232,238 ****
  	else {
  		pyext *ext = GetThis(self);
! 		int cnt = 0;
  		t_atom at;
! 		if(val >= 0) flext::SetInt(at,val);
  		ext->m_stop(cnt,&at);
  	}
--- 234,241 ----
  	else {
  		pyext *ext = GetThis(self);
! 		int cnt;
  		t_atom at;
! 		if(val >= 0) cnt = 1,flext::SetInt(at,val);
!         else cnt = 0;
  		ext->m_stop(cnt,&at);
  	}

Index: main.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/main.cpp,v
retrieving revision 1.26
retrieving revision 1.27
diff -C2 -d -r1.26 -r1.27
*** main.cpp	6 Mar 2005 04:57:32 -0000	1.26
--- main.cpp	8 Mar 2005 04:59:25 -0000	1.27
***************
*** 158,165 ****
  }
  
! py::py(): 
! 	module(NULL),
! 	detach(0),shouldexit(false),thrcount(0),
! 	stoptick(0)
  {
      PyThreadState *state = PyLock();
--- 158,166 ----
  }
  
! py::py()
!     : module(NULL),detach(0)
! #ifdef FLEXT_THREADS
!     , shouldexit(false),thrcount(0),stoptick(0)
! #endif
  {
      PyThreadState *state = PyLock();
***************
*** 167,173 ****
      PyUnlock(state);
  
      FLEXT_ADDTIMER(stoptmr,tick);
  
- #ifdef FLEXT_THREADS
      // launch thread worker
      FLEXT_CALLMETHOD(threadworker);
--- 168,174 ----
      PyUnlock(state);
  
+ #ifdef FLEXT_THREADS
      FLEXT_ADDTIMER(stoptmr,tick);
  
      // launch thread worker
      FLEXT_CALLMETHOD(threadworker);
***************
*** 177,201 ****
  py::~py()
  {
!     shouldexit = true;
  
  #ifdef FLEXT_THREADS
      qucond.Signal();
-     
      if(thrcount) {
  		// Wait for a certain time
! 		for(int i = 0; i < (PY_STOP_WAIT/PY_STOP_TICK) && thrcount; ++i) Sleep((float)(PY_STOP_TICK/1000.));
  
  		// Wait forever
  		post("%s - Waiting for thread termination!",thisName());
! 		while(thrcount) Sleep(0.01f);
  		post("%s - Okay, all threads have terminated",thisName());
  	}
  #endif
!     PyThreadState *state = PyLock();
!    	Py_XDECREF(module_obj);
!     PyUnlock(state);
  }
  
- 
  void py::GetDir(PyObject *obj,AtomList &lst)
  {
--- 178,204 ----
  py::~py()
  {
!     PyThreadState *state = PyLock();
!    	Py_XDECREF(module_obj);
!     PyUnlock(state);
! }
  
+ void py::Exit()
+ {
  #ifdef FLEXT_THREADS
+     shouldexit = true;
      qucond.Signal();
      if(thrcount) {
  		// Wait for a certain time
! 		for(int i = 0; i < (PY_STOP_WAIT/PY_STOP_TICK) && thrcount; ++i) Sleep(PY_STOP_TICK/1000.f);
  
  		// Wait forever
  		post("%s - Waiting for thread termination!",thisName());
! 		while(thrcount) Sleep(PY_STOP_TICK/1000.f);
  		post("%s - Okay, all threads have terminated",thisName());
  	}
  #endif
!     flext_base::Exit();
  }
  
  void py::GetDir(PyObject *obj,AtomList &lst)
  {
***************
*** 476,480 ****
              ret = qucall(pmeth,pargs);
              break;
- #endif
          case 2:
              // each call a new thread
--- 479,482 ----
***************
*** 484,489 ****
  		    }
              break;
          default:
!             FLEXT_ASSERT(false);
      }
      return ret;
--- 486,492 ----
  		    }
              break;
+ #endif
          default:
!             post("%s - Unknown detach mode",thisName());
      }
      return ret;
***************
*** 494,498 ****
--- 497,503 ----
      FLEXT_ASSERT(data);
  
+ #ifdef FLEXT_THREADS
  	++thrcount;
+ #endif
  
      PyThreadState *state = PyLock();
***************
*** 505,509 ****
--- 510,516 ----
      PyUnlock(state);
  
+ #ifdef FLEXT_THREADS
      --thrcount;
+ #endif
  }
  
***************
*** 523,528 ****
      PyThreadState *state;
  
!     while(!shouldexit) {
          while(el = qufifo.Get()) {
              state = PyLock();
              callpy(el->fun,el->args);
--- 530,537 ----
      PyThreadState *state;
  
!    	++thrcount;
!     for(;;) {
          while(el = qufifo.Get()) {
+         	++thrcount;
              state = PyLock();
              callpy(el->fun,el->args);
***************
*** 531,536 ****
              PyUnlock(state);
              qufifo.Free(el);
          }
!         qucond.Wait();
      }
  
--- 540,549 ----
              PyUnlock(state);
              qufifo.Free(el);
+             --thrcount;
          }
!         if(shouldexit) 
!             break;
!         else
!             qucond.Wait();
      }
  
***************
*** 543,546 ****
--- 556,560 ----
      }
      PyUnlock(state);
+     --thrcount;
  }
  #endif

Index: main.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/main.h,v
retrieving revision 1.33
retrieving revision 1.34
diff -C2 -d -r1.33 -r1.34
*** main.h	6 Mar 2005 04:57:32 -0000	1.33
--- main.h	8 Mar 2005 04:59:25 -0000	1.34
***************
*** 26,31 ****
  #define PYEXT_CLASS "_class"  // name for base class
  
! #define PY_STOP_WAIT 1000  // ms
! #define PY_STOP_TICK 10  // ms
  
  
--- 26,31 ----
  #define PYEXT_CLASS "_class"  // name for base class
  
! #define PY_STOP_WAIT 100  // ms
! #define PY_STOP_TICK 1  // ms
  
  
***************
*** 51,54 ****
--- 51,56 ----
  	static void lib_setup();
  
+     virtual void Exit();
+ 
  	static PyObject *MakePyArgs(const t_symbol *s,int argc,const t_atom *argv,int inlet = -1,bool withself = false);
  	static AtomList *GetPyArgs(PyObject *pValue,PyObject **self = NULL);
***************
*** 110,121 ****
  	virtual void m_stop(int argc,const t_atom *argv);
  
! 	bool shouldexit,respond;
  	int thrcount;
  	int stoptick;
      Timer stoptmr;
-     int detach;
  
  	void tick(void *);
!     
      bool gencall(PyObject *fun,PyObject *args);
      virtual bool callpy(PyObject *fun,PyObject *args) = 0;
--- 112,127 ----
  	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 callpy(PyObject *fun,PyObject *args) = 0;
***************
*** 154,162 ****
      // 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
      static int lockcount;
  
  	inline PyThreadState *PyLock() 
      { 
!         if(!lockcount++) PyEval_AcquireLock();
  	    return PyThreadState_Swap(FindThreadState());
      }
--- 160,169 ----
      // 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());
      }
***************
*** 165,169 ****
      {
          PyThreadState_Swap(st);
!         if(!--lockcount) PyEval_ReleaseLock();
      }
  #else
--- 172,176 ----
      {
          PyThreadState_Swap(st);
!         if(!IsSystemThread() || !--lockcount) PyEval_ReleaseLock();
      }
  #else
***************
*** 190,196 ****
  	FLEXT_CALLGET_V(mg_dir)
  	FLEXT_CALLBACK(m_doc)
-     FLEXT_CALLBACK_T(tick)
  
  #ifdef FLEXT_THREADS
      FLEXT_THREAD(threadworker)
  #endif
--- 197,203 ----
  	FLEXT_CALLGET_V(mg_dir)
  	FLEXT_CALLBACK(m_doc)
  
  #ifdef FLEXT_THREADS
+     FLEXT_CALLBACK_T(tick)
      FLEXT_THREAD(threadworker)
  #endif





More information about the Pd-cvs mailing list