I have some weeks before reported, FlashFXP v3.02 loops with a message-loop in listview.c after login. It does this in Odin and in Wine. In Odin it stops in smaller time (deep 1000). Wine has a bigger stack, and so needs wine more time for this, bat I can see in the loog, the args for the function are more and more locatet at lower stack adresses. I have written this workarout for testing this problem in wine and in odin. with this FlashFXH 3.02 will display the contence of the server dir very fast at both environment. In the log I can see, that the message-loop was reported and stopped. I thing, we need a flag inside any item to report every function, that can called recursive, this item is in work (function-separart, or global ?), that can stop recursions of this type in the future or many programms. I have also found this try does also helps Agent 2.0 in the groups->defailt propertys (only odin-tested). This does also every crashs in earlyer builds with stack overflow in odin.
Dietrich
Index: wine/dlls/comctl32/listview.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/listview.c,v retrieving revision 1.406 diff -u -r1.406 listview.c --- wine/dlls/comctl32/listview.c 25 Mar 2005 20:49:00 -0000 1.406 +++ wine/dlls/comctl32/listview.c 29 Mar 2005 16:31:48 -0000 @@ -139,6 +139,7 @@ * WM_CREATE does not issue WM_QUERYUISTATE and associated registry * processing for "USEDOUBLECLICKTIME". */ +#define __T__
#include "config.h" #include "wine/port.h" @@ -7050,10 +7051,23 @@ * SUCCESS : TRUE * FAILURE : FALSE */ +#ifdef __T__ +static int zIndex = -2; +typedef struct { + PVOID lTol; + HWND cHwnd; + HWND cHwndParent; + INT cItem; + } SetItemStateLink, *PSetItemStateLink; +#endif static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, const LVITEMW *lpLVItem) { BOOL bResult = TRUE; LVITEMW lvItem; +#ifdef __T__ + int saveLastError = GetLastError(); + SetItemStateLink cTol = { NULL, infoPtr->hwndSelf, infoPtr->hwndNotify, nItem}; +#endif
lvItem.iItem = nItem; lvItem.iSubItem = 0; @@ -7062,6 +7076,34 @@ lvItem.stateMask = lpLVItem->stateMask; TRACE("lvItem=%s\n", debuglvitem_t(&lvItem, TRUE));
+#ifdef __T__ + if (-2 == zIndex) + { + zIndex = TlsAlloc(); + SetLastError(saveLastError); + } /* endif */ + if (zIndex >= 0) + { + cTol.lTol = TlsGetValue(zIndex); + if (cTol.lTol < (PVOID)&cTol) + { + cTol.lTol = NULL; + } /* endif */ + SetLastError(saveLastError); + if (cTol.lTol + && (((PSetItemStateLink)cTol.lTol)->cHwnd == infoPtr->hwndSelf) + && (((PSetItemStateLink)cTol.lTol)->cHwndParent == infoPtr->hwndNotify) + && (((PSetItemStateLink)cTol.lTol)->cItem == nItem)) + { + TRACE_(listview)("(DT) Hwnd:%x,%x Parent:%x,%x Item:%d,%d, stop the recursion\n", infoPtr->hwndSelf, ((PSetItemStateLink)cTol.lTol)->cHwnd, + infoPtr->hwndNotify, ((PSetItemStateLink)cTol.lTol)->cHwndParent, + nItem, ((PSetItemStateLink)cTol.lTol)->cItem); + return TRUE; + } + TlsSetValue(zIndex,(LPVOID)&cTol); + SetLastError(saveLastError); + } +#endif if (nItem == -1) { /* apply to all items */ @@ -7070,6 +7112,14 @@ } else bResult = LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE); +#ifdef __T__ + if (zIndex >= 0) + { + saveLastError = GetLastError(); + TlsSetValue(zIndex,(LPVOID)cTol.lTol); + SetLastError(saveLastError); + } +#endif
/* *update selection mark