[PD-cvs] externals/grill/py/source clmeth.cpp,1.13,1.14 main.cpp,1.24,1.25 main.h,1.31,1.32 pyargs.cpp,1.12,1.13 pyext.cpp,1.27,1.28
Thomas Grill
xovo at users.sourceforge.net
Sun Feb 27 05:57:49 CET 2005
Update of /cvsroot/pure-data/externals/grill/py/source
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27140/source
Modified Files:
clmeth.cpp main.cpp main.h pyargs.cpp pyext.cpp
Log Message:
better error reporting
use lock count instead of message queuing to avoid py->py messaging deadlock
must clear Python error...
Index: clmeth.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/clmeth.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -C2 -d -r1.13 -r1.14
*** clmeth.cpp 11 Jan 2005 04:59:27 -0000 1.13
--- clmeth.cpp 27 Feb 2005 04:57:30 -0000 1.14
***************
*** 176,184 ****
// deadlock would occur if this was another py/pyext object!
if(lst->Count() && IsSymbol((*lst)[0]))
! ext->ToQueueAnything(o-1,GetSymbol((*lst)[0]),lst->Count()-1,lst->Atoms()+1);
else if(lst->Count() > 1)
! ext->ToQueueList(o-1,*lst);
else
! ext->ToQueueAtom(o-1,*lst->Atoms());
}
else
--- 176,184 ----
// deadlock would occur if this was another py/pyext object!
if(lst->Count() && IsSymbol((*lst)[0]))
! ext->ToOutAnything(o-1,GetSymbol((*lst)[0]),lst->Count()-1,lst->Atoms()+1);
else if(lst->Count() > 1)
! ext->ToOutList(o-1,*lst);
else
! ext->ToOutAtom(o-1,*lst->Atoms());
}
else
Index: pyargs.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/pyargs.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** pyargs.cpp 19 Jan 2005 04:58:36 -0000 1.12
--- pyargs.cpp 27 Feb 2005 04:57:47 -0000 1.13
***************
*** 15,20 ****
if(flext::IsSymbol(at))
return pySymbol_FromSymbol(flext::GetSymbol(at));
! // else if(flext::IsPointer(at)) return NULL; // not handled
! else if(flext::CanbeInt(at) && flext::CanbeFloat(at)) {
// if a number can be an integer... let at be an integer!
int ival = flext::GetAInt(at);
--- 15,19 ----
if(flext::IsSymbol(at))
return pySymbol_FromSymbol(flext::GetSymbol(at));
! else if(flext::CanbeInt(at) || flext::CanbeFloat(at)) {
// if a number can be an integer... let at be an integer!
int ival = flext::GetAInt(at);
***************
*** 22,29 ****
return (double)ival == fval?PyInt_FromLong(ival):PyFloat_FromDouble(fval);
}
// these following should never happen
else if(flext::IsFloat(at)) return PyFloat_FromDouble((double)flext::GetFloat(at));
else if(flext::IsInt(at)) return PyInt_FromLong(flext::GetInt(at));
!
return NULL;
}
--- 21,30 ----
return (double)ival == fval?PyInt_FromLong(ival):PyFloat_FromDouble(fval);
}
+ // else if(flext::IsPointer(at)) return NULL; // not handled
+ /*
// these following should never happen
else if(flext::IsFloat(at)) return PyFloat_FromDouble((double)flext::GetFloat(at));
else if(flext::IsInt(at)) return PyInt_FromLong(flext::GetInt(at));
! */
return NULL;
}
Index: pyext.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/pyext.cpp,v
retrieving revision 1.27
retrieving revision 1.28
diff -C2 -d -r1.27 -r1.28
*** pyext.cpp 26 Feb 2005 04:57:48 -0000 1.27
--- pyext.cpp 27 Feb 2005 04:57:47 -0000 1.28
***************
*** 240,243 ****
--- 240,245 ----
Py_DECREF(objdel);
}
+ else
+ PyErr_Clear();
gcrun = pyobj->ob_refcnt > 1;
Index: main.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/main.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -C2 -d -r1.24 -r1.25
*** main.cpp 26 Feb 2005 04:57:48 -0000 1.24
--- main.cpp 27 Feb 2005 04:57:47 -0000 1.25
***************
*** 28,31 ****
--- 28,33 ----
static PyThrMap pythrmap;
+ int py::lockcount = 0;
+
PyThreadState *py::FindThreadState()
{
Index: main.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/main.h,v
retrieving revision 1.31
retrieving revision 1.32
diff -C2 -d -r1.31 -r1.32
*** main.h 26 Feb 2005 04:57:48 -0000 1.31
--- main.h 27 Feb 2005 04:57:47 -0000 1.32
***************
*** 160,166 ****
inline void Unlock() { mutex.Unlock(); }
inline PyThreadState *PyLock()
{
! PyEval_AcquireLock();
return PyThreadState_Swap(FindThreadState());
}
--- 160,170 ----
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
+ static int lockcount;
+
inline PyThreadState *PyLock()
{
! if(!lockcount++) PyEval_AcquireLock();
return PyThreadState_Swap(FindThreadState());
}
***************
*** 169,173 ****
{
PyThreadState_Swap(st);
! PyEval_ReleaseLock();
}
#else
--- 173,177 ----
{
PyThreadState_Swap(st);
! if(!--lockcount) PyEval_ReleaseLock();
}
#else
More information about the Pd-cvs
mailing list