[pywin32-checkins] pywin32/Pythonwin win32assoc.cpp, 1.7, 1.8 win32virt.cpp, 1.3, 1.4
OLD project page for the Python extensions for Windows
Brought to you by:
mhammond
From: Mark H. <mha...@us...> - 2006-11-20 12:36:43
|
Update of /cvsroot/pywin32/pywin32/Pythonwin In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26808 Modified Files: win32assoc.cpp win32virt.cpp Log Message: Fix a number of Py_DECEFs that happened without the GIL held and other nastiness. Fix [ 1590399 ] Refcounting / GIL problems (dual [core machines]) Thanks to kxroberto for the patch. Index: win32assoc.cpp =================================================================== RCS file: /cvsroot/pywin32/pywin32/Pythonwin/win32assoc.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** win32assoc.cpp 12 Apr 2005 06:02:34 -0000 1.7 --- win32assoc.cpp 20 Nov 2006 12:36:41 -0000 1.8 *************** *** 253,259 **** if (this==NULL) return NULL; if (virtualInst) { DODECREF(this); ! DOINCREF(virtualInst); ! return virtualInst; } else return this; --- 253,260 ---- if (this==NULL) return NULL; if (virtualInst) { + PyObject *vi = virtualInst; + DOINCREF(vi); DODECREF(this); ! return vi; } else return this; Index: win32virt.cpp =================================================================== RCS file: /cvsroot/pywin32/pywin32/Pythonwin/win32virt.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** win32virt.cpp 11 Jul 2006 05:18:30 -0000 1.3 --- win32virt.cpp 20 Nov 2006 12:36:41 -0000 1.4 *************** *** 34,39 **** } // ok - have the python data type - now see if it has an override. if (py_bob->virtualInst) { - CEnterLeavePython _celp; PyObject *t, *v, *tb; PyErr_Fetch(&t,&v,&tb); --- 34,39 ---- } // ok - have the python data type - now see if it has an override. + CEnterLeavePython _celp; if (py_bob->virtualInst) { PyObject *t, *v, *tb; PyErr_Fetch(&t,&v,&tb); *************** *** 57,73 **** CVirtualHelper::~CVirtualHelper() { ! // XXX - Gross hack for speed. This is called for eachh window message ! // so only grabs the Python lock if the objects need Python, ! if ((retVal && retVal->ob_refcnt==1) || ! (handler && handler->ob_refcnt==1) || ! (py_ob && py_ob->ob_refcnt==1)) { CEnterLeavePython _celp; XDODECREF(retVal); XDODECREF(handler); XDODECREF(py_ob); - } else { - XDODECREF(retVal); - XDODECREF(handler); - XDODECREF(py_ob); } } --- 57,68 ---- CVirtualHelper::~CVirtualHelper() { ! // This is called for each window message, so should be as fast ! // as possible - but DECREF is not atomic on multi-core CPU's, so ! // take the reliable option... ! if (py_ob || handler || retVal) { CEnterLeavePython _celp; XDODECREF(retVal); XDODECREF(handler); XDODECREF(py_ob); } } *************** *** 78,82 **** BOOL CVirtualHelper::do_call(PyObject *args) { - CEnterLeavePython _celp; XDODECREF(retVal); // our old one. retVal = NULL; --- 73,76 ---- *************** *** 120,123 **** --- 114,118 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; return do_call(arglst); } *************** *** 126,129 **** --- 121,125 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *arglst = Py_BuildValue("()"); return do_call(arglst); *************** *** 132,135 **** --- 128,132 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *arglst = Py_BuildValue("(i)",val); return do_call(arglst); *************** *** 138,141 **** --- 135,139 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *arglst = Py_BuildValue("(ii)",val, val2); return do_call(arglst); *************** *** 144,147 **** --- 142,146 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *arglst = Py_BuildValue("(iii)",val1, val2, val3); return do_call(arglst); *************** *** 150,153 **** --- 149,153 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *arglst = Py_BuildValue("(l)",val); return do_call(arglst); *************** *** 157,160 **** --- 157,161 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *arglst = Py_BuildValue("(z)",val); return do_call(arglst); *************** *** 163,166 **** --- 164,168 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *arglst = Py_BuildValue("(zi)",val,ival); return do_call(arglst); *************** *** 169,172 **** --- 171,175 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; if (!ob) ob=Py_None; *************** *** 177,180 **** --- 180,184 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; if (!ob) ob=Py_None; *************** *** 187,190 **** --- 191,195 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; if (!ob) ob=Py_None; *************** *** 198,201 **** --- 203,207 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *dc = (PyObject *) ui_assoc_object::make (ui_dc_object::type, pDC)->GetGoodRet(); *************** *** 209,212 **** --- 215,219 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *dc = (PyObject *) ui_assoc_object::make (ui_dc_object::type, pDC)->GetGoodRet(); *************** *** 233,236 **** --- 240,244 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *info = NULL; PyObject *arglst; *************** *** 250,253 **** --- 258,262 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *wnd = PyWinObject_FromCWnd(pWnd); if (!wnd) return FALSE; *************** *** 261,264 **** --- 270,274 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *wnd = PyWinObject_FromCWnd(pWnd); if (!wnd) return FALSE; *************** *** 272,275 **** --- 282,286 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *wnd = PyWinObject_FromCWnd(pWnd); if (!wnd) return FALSE; *************** *** 283,286 **** --- 294,298 ---- { PyObject *wnd ; + CEnterLeavePython _celp; if (pWnd==NULL) { wnd = Py_None; *************** *** 306,309 **** --- 318,322 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; if (!ob) ob=Py_None; *************** *** 325,328 **** --- 338,342 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *wnd1; if (pWnd1) { *************** *** 351,354 **** --- 365,369 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *doc = (PyObject *) ui_assoc_object::make (PyCDocument::type, pDoc)->GetGoodRet(); *************** *** 362,365 **** --- 377,381 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *cs = PyObjectFromCreateStruct(lpcs); if (!cs) return FALSE; *************** *** 373,376 **** --- 389,393 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *cs = PyObjectFromCreateStruct(lpcs); if (!cs) return FALSE; *************** *** 384,387 **** --- 401,405 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *arglst = Py_BuildValue("((iiiii(ii)))",msg->hwnd,msg->message,msg->wParam,msg->lParam,msg->time,msg->pt.x,msg->pt.y); BOOL ret = do_call(arglst); *************** *** 392,395 **** --- 410,414 ---- { if (!handler) return FALSE; + CEnterLeavePython _celp; PyObject *arglst = Py_BuildValue("iill",nID, nCode, (long)pExtra, (long)pHandlerInfo); BOOL ret = do_call(arglst); |