How to find cause for Python/Pythonwin crash only on Dual Core Machines ?
robert
no-spam at no-spam-no-spam.com
Thu Mar 2 09:18:43 EST 2006
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;
}
More information about the Python-list
mailing list