|
From: David B. <dav...@us...> - 2004-11-29 05:45:45
|
Update of /cvsroot/frontierkernel/Frontier/Common/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8994 Modified Files: Tag: sidewinder-branch langpython.c Log Message: fixed table code regression -- if you're going to mess with the global interpreter lock in Python, make sure you do it correctly Index: langpython.c =================================================================== RCS file: /cvsroot/frontierkernel/Frontier/Common/source/langpython.c,v retrieving revision 1.2.4.22 retrieving revision 1.2.4.23 diff -C2 -d -r1.2.4.22 -r1.2.4.23 *** langpython.c 28 Nov 2004 21:34:30 -0000 1.2.4.22 --- langpython.c 29 Nov 2004 05:45:32 -0000 1.2.4.23 *************** *** 227,230 **** --- 227,233 ---- PyThreadState * (*ptr_PyEval_SaveThread) (void); void (*ptr_PyEval_SetProfile) (Py_tracefunc, PyObject *); + void (*ptr_PyEval_InitThreads) (void); + void (*ptr_PyEval_AcquireLock) (void); + void (*ptr_PyEval_ReleaseLock) (void); } py; *************** *** 331,334 **** --- 334,340 ---- #define PyEval_RestoreThread (*py.ptr_PyEval_RestoreThread) #define PyEval_SetProfile (*py.ptr_PyEval_SetProfile) + #define PyEval_InitThreads (*py.ptr_PyEval_InitThreads) + #define PyEval_AcquireLock (*py.ptr_PyEval_AcquireLock) + #define PyEval_ReleaseLock (*py.ptr_PyEval_ReleaseLock) static boolean importsymbol (typythonlib hm, char *symbol, void **ptraddress) { *************** *** 471,474 **** --- 477,483 ---- fl = fl && IMPORTSYMBOL (hm, PyEval_RestoreThread); fl = fl && IMPORTSYMBOL (hm, PyEval_SetProfile); + fl = fl && IMPORTSYMBOL (hm, PyEval_InitThreads); + fl = fl && IMPORTSYMBOL (hm, PyEval_AcquireLock); + fl = fl && IMPORTSYMBOL (hm, PyEval_ReleaseLock); if (fl) { *************** *** 541,554 **** static PyObject *frontierModule = NULL; ! PyThreadState *_save; static void getpythonlock() { ! PyEval_RestoreThread(_save); } static void releasepythonlock() { ! _save = PyEval_SaveThread(); } --- 550,580 ---- static PyObject *frontierModule = NULL; ! //static PyThreadState *saveState; ! static boolean locked = true; ! static int lockCount = 0; static void getpythonlock() { ! lockCount++; ! ! if (locked) ! return; ! ! locked = true; ! //PyEval_RestoreThread(saveState); ! PyEval_AcquireLock(); } static void releasepythonlock() { ! if (lockCount == 0) ! return; ! ! lockCount--; ! if (lockCount == 0) { ! locked = false; ! //saveState = PyEval_SaveThread(); ! PyEval_ReleaseLock(); ! } } *************** *** 1628,1631 **** --- 1654,1658 ---- checkstatus(PyObject *o, PyFrameObject *frame, int what, PyObject *arg) { //printf("tick\n"); + langbackgroundtask(false); return 0; } *************** *** 1637,1640 **** --- 1664,1668 ---- if (!Py_IsInitialized()) { Py_Initialize(); + PyEval_InitThreads(); initGlobals(); *************** *** 1646,1650 **** currentCookie = time(NULL); ! PyEval_SetProfile(checkstatus, NULL); releasepythonlock(); --- 1674,1678 ---- currentCookie = time(NULL); ! //PyEval_SetProfile(checkstatus, NULL); releasepythonlock(); |