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.l...9b147e870bd5e6
http://sourceforge.net/tracker/?grou...ail&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_c all,
LPVOID lpReserved
)
{
return TRUE;
}
class CAllowThreads {
public:
PyThreadState *_save; \
CAllowThreads() {
_save = PyEval_SaveThre ad();
}
~CAllowThreads( ) {
PyEval_RestoreT hread(_save);
}
};
PyObject* PyListView_GetS ubItemRect(
HWND hwndLV,
int iItem,
int iSubItem,
int code
// LPRECT lpRect
)
{
RECT r;
{
CAllowThreads _t;
ListView_GetSub ItemRect(
hwndLV,
iItem,
iSubItem,
code,
&r );
}
return Py_BuildValue(" iiii", r.left,r.top,r. right,r.bottom) ;
}
int GetStringAddr(c onst char* s) {
return (int)s;
}
int PlaySoundResour ce(int resid, HMODULE hmod)
{
CAllowThreads _t;
return PlaySound(MAKEI NTRESOURCE(resi d), hmod, SND_RESOURCE);
}
int PlaySoundFile(c onst char* fname, int flag)
{
CAllowThreads _t;
return PlaySound(fname , NULL, flag);
}
PyObject* py_ToolTipRelay Msg( PyObject* self, PyObject* args )
{
MSG msg;
HWND hwTT;
if(!PyArg_Parse Tuple(args,"i(i iiii(ii)):ToolT ipRelayMsg",
&hwTT,
&msg.hwnd,&msg. message,&msg.wP aram,&msg.lPara m,&msg.time,
&msg.pt, ((int*)&msg.pt) +1) )
return NULL;
{
CAllowThreads _t;
SendMessage(hwT T,TTM_RELAYEVEN T,0,(LPARAM)&ms g);
}
Py_INCREF( Py_None );
return Py_None;
}
---
"GetStringAddre ss" is used only once like this (leades to correct NUL
termination I think):
self.sb.SendMes sage(commctrl.S B_SETTEXT,iPane ,extension.GetS tringAddr(text) )
--- swig:
static PyObject *_wrap_GetStrin gAddr(PyObject *self, PyObject *args) {
PyObject *resultobj;
char *arg0 ;
int result ;
if(!PyArg_Parse Tuple(args,(cha r *)"s:GetStringA ddr",&arg0)) return
NULL;
result = (int )GetStringAddr( (char const *)arg0);
resultobj = PyInt_FromLong( (long)result);
return resultobj;
}