Update of /cvsroot/pure-data/externals/grill/py/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11209/source
Modified Files: main.cpp main.h Log Message: use new flext fifo use lock count instead of message queuing to avoid py->py messaging deadlock
Index: main.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/main.cpp,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** main.cpp 27 Feb 2005 04:57:47 -0000 1.25 --- main.cpp 6 Mar 2005 04:57:32 -0000 1.26 *************** *** 511,535 **** bool py::qucall(PyObject *fun,PyObject *args) { ! if(qufifo.Push(fun,args)) { ! qucond.Signal(); ! return true; ! } ! else ! return false; }
void py::threadworker() { ! PyObject *fun,*args; PyThreadState *state;
while(!shouldexit) { ! state = PyLock(); ! while(qufifo.Pop(fun,args)) { ! callpy(fun,args); ! Py_XDECREF(fun); ! Py_XDECREF(args); } - PyUnlock(state); qucond.Wait(); } --- 511,535 ---- bool py::qucall(PyObject *fun,PyObject *args) { ! FifoEl *el = qufifo.New(); ! el->Set(fun,args); ! qufifo.Put(el); ! qucond.Signal(); ! return true; }
void py::threadworker() { ! FifoEl *el; PyThreadState *state;
while(!shouldexit) { ! while(el = qufifo.Get()) { ! state = PyLock(); ! callpy(el->fun,el->args); ! Py_XDECREF(el->fun); ! Py_XDECREF(el->args); ! PyUnlock(state); ! qufifo.Free(el); } qucond.Wait(); } *************** *** 537,545 **** state = PyLock(); // unref remaining Python objects ! while(qufifo.Pop(fun,args)) { ! Py_XDECREF(fun); ! Py_XDECREF(args); } - PyUnlock(state); } --- 537,545 ---- state = PyLock(); // unref remaining Python objects ! while(el = qufifo.Get()) { ! Py_XDECREF(el->fun); ! Py_XDECREF(el->args); ! qufifo.Free(el); } PyUnlock(state); } *************** *** 576,611 **** return true; } - - Fifo::~Fifo() - { - FifoEl *el = head; - head = tail = NULL; // reset it, in case there's a thread wanting to Pop - while(el) { - FifoEl *n = el->nxt; - delete el; - el = n; - } - } - - bool Fifo::Push(PyObject *f,PyObject *a) - { - FifoEl *el = new FifoEl; - el->fun = f; - el->args = a; - if(tail) tail->nxt = el; - else head = el; - tail = el; - return true; - } - - bool Fifo::Pop(PyObject *&f,PyObject *&a) - { - if(!head) return false; - FifoEl *el = head; - head = el->nxt; - f = el->fun; - a = el->args; - if(tail == el) tail = NULL; - delete el; - return true; - } --- 576,577 ----
Index: main.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/main.h,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** main.h 27 Feb 2005 04:57:47 -0000 1.32 --- main.h 6 Mar 2005 04:57:32 -0000 1.33 *************** *** 14,17 **** --- 14,18 ---- #include "pyprefix.h" #include "pysymbol.h" + #include <flcontainers.h>
#if FLEXT_OS == FLEXT_LINUX || FLEXT_OS == FLEXT_IRIX *************** *** 29,51 ****
! class Fifo { - protected: - struct FifoEl { - PyObject *fun; - PyObject *args; - FifoEl *nxt; - }; public: ! Fifo(): head(NULL),tail(NULL) {} ! ~Fifo(); ! ! bool Push(PyObject *f,PyObject *a); ! bool Pop(PyObject *&f,PyObject *&a); ! ! protected: ! FifoEl *head,*tail; };
class py: --- 30,43 ----
! ! class FifoEl ! : public Fifo::Cell { public: ! void Set(PyObject *f,PyObject *a) { fun = f,args = a; } ! PyObject *fun,*args; };
+ typedef PooledFifo<FifoEl> PyFifo;
class py: *************** *** 142,146 **** bool qucall(PyObject *fun,PyObject *args); void threadworker(); ! Fifo qufifo; ThrCond qucond;
--- 134,138 ---- bool qucall(PyObject *fun,PyObject *args); void threadworker(); ! PyFifo qufifo; ThrCond qucond;