How to find cause for Python/Pythonwin crash only on Dual Core Machines ?

Larry Bates larry.bates at websafe.com
Fri Mar 3 17:00:25 CET 2006


robert wrote:
> There is a strange freeze/crash only on dual core machines:
> 
> I have a python app (Python 2.3.5 /Pythonwin build 203 / Windows)
> running with no stability problems on normal machines (Or a crash is so
> rare, that absolutely nobody obverses it, though the overall majority of
> users uses single core machines). Threads, network & pythonwin/win32ui
> all in use.
> 
> Yet, from 3 users, _all_ using a Dual Processor System (XEON, amd x2
> 3800+) computer, I have reports, that the application freezes hard
> and/or crashes with a kind of random stack dump (operating system). I
> cannot experiment with those machines.
> 
> I found no hints other than:
> 
> http://groups.google.de/group/comp.lang.python/browse_frm/thread/64ca033e1a7f6c61/719b147e870bd5e6
> 
> 
> http://sourceforge.net/tracker/?group_id=5470&atid=105470&func=detail&aid=480325
> 
> 
> .. both discussions remaining in uncertainty.
> 
> Are there (known) problems with Python/Pythonwin specific for dual
> core's  (py2.3.5 / pywin203) ?
> 
> What could I do to find the problem?
> 
> Robert
> 
> 
> --------------
> 
> PS: there is very little C extension-code (SWIG) involved, yet I looked
> over that so often, I guess its save:
> 
> 
> //
> 
> #include "stdafx.h"
> #include "commctrl.h"
> #include "ext.h"
> 
> BOOL APIENTRY DllMain( HANDLE hModule,
>                        DWORD  ul_reason_for_call,
>                        LPVOID lpReserved
>                      )
> {
>     return TRUE;
> }
> 
> class CAllowThreads {
> public:
>     PyThreadState *_save; \
>     CAllowThreads() {
>             _save = PyEval_SaveThread();
>     }
>     ~CAllowThreads() {
>         PyEval_RestoreThread(_save);
>     }
> };
> 
> PyObject* PyListView_GetSubItemRect(
>     HWND hwndLV,
>     int iItem,
>     int iSubItem,
>     int code
> //    LPRECT lpRect
> )
> {
>     RECT r;
>     {
>       CAllowThreads _t;
>       ListView_GetSubItemRect(
>         hwndLV,
>         iItem,
>         iSubItem,
>         code,
>         &r );
>     }
>     return Py_BuildValue("iiii", r.left,r.top,r.right,r.bottom);
> 
> }
> 
> int GetStringAddr(const char* s) {
>     return (int)s;
> }
> 
> int PlaySoundResource(int resid, HMODULE hmod)
> {
>     CAllowThreads _t;
>     return PlaySound(MAKEINTRESOURCE(resid), hmod, SND_RESOURCE);
> }
> 
> int PlaySoundFile(const char* fname, int flag)
> {
>     CAllowThreads _t;
>     return PlaySound(fname, NULL, flag);
> }
> 
> PyObject* py_ToolTipRelayMsg(  PyObject* self, PyObject* args )
> {
>     MSG msg;
>     HWND hwTT;
>     if(!PyArg_ParseTuple(args,"i(iiiii(ii)):ToolTipRelayMsg",
>                          &hwTT,
> 
> &msg.hwnd,&msg.message,&msg.wParam,&msg.lParam,&msg.time,
>                          &msg.pt, ((int*)&msg.pt)+1) )
>         return NULL;
> 
>     
>     {
>       CAllowThreads _t;
>       SendMessage(hwTT,TTM_RELAYEVENT,0,(LPARAM)&msg);
>     }
> 
>     Py_INCREF( Py_None );
>     return Py_None;
> }
> 
> ---
> 
> "GetStringAddress" is used only once like this (leades to correct NUL
> termination I think):
> 
> self.sb.SendMessage(commctrl.SB_SETTEXT,iPane,extension.GetStringAddr(text))
> 
> 
> --- swig:
> static PyObject *_wrap_GetStringAddr(PyObject *self, PyObject *args) {
>     PyObject *resultobj;
>     char *arg0 ;
>     int result ;
> 
>     if(!PyArg_ParseTuple(args,(char *)"s:GetStringAddr",&arg0)) return
> NULL;
>     result = (int )GetStringAddr((char const *)arg0);
>     resultobj = PyInt_FromLong((long)result);
>     return resultobj;
> }

I've run on Dual 1.7, 2.4Ghz Xeon machines and a hyperthreaded
3.0Ghz machine for several years with no problems.  I don't think
there is an inherent problem.

-Larry Bates



More information about the Python-list mailing list