﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc
9	Prevent nested refreshes	erdmann	rlwalsh	"Version 1.0.16:

Refreshing an open folder multiple times will lead to nested invocations of ""wpRefresh"" that compete with each other (and starting multiple refresh threads).

I suggest this change, so that ""wpRefresh"" will not be called nested (src\classes\xfldr.c):


{{{
SOM_Scope BOOL  SOMLINK xf_wpRefresh(XFolder *somSelf,
                                     ULONG ulView,
                                     PVOID pReserved)
{
    BOOL        rc;
    ULONG fFlags;

    // XFolderData *somThis = XFolderGetData(somSelf);
    XFolderMethodDebug(""XFolder"",""xf_wpRefresh"");

    fFlags = _wpQueryFldrFlags(somSelf);

    if (fFlags & (FOI_REFRESHINPROGRESS | FOI_POPULATEINPROGRESS))
    {
       return FALSE;
    }

   _wpModifyFldrFlags(somSelf, FOI_REFRESHINPROGRESS,FOI_REFRESHINPROGRESS);

    rc = XFolder_parent_WPFolder_wpRefresh(somSelf, ulView, pReserved);

    fdrForEachOpenInstanceView(somSelf,
                               stb_UpdateCallback,
                               2);           // update

    xthrPostWorkerMsg(WOM_REFRESHFOLDERVIEWS,
                      (MPARAM)somSelf,
                      (MPARAM)FDRUPDATE_TITLE);

   _wpModifyFldrFlags(somSelf, FOI_REFRESHINPROGRESS,0);

    return rc;
}
}}}

It might also be better to move the ""_wpModifyFldrFlags(somSelf, FOI_REFRESHINPROGRESS,0);"" call to the window function invoked by ""xthrPostWorkerMsg"" (src\filesys\xthreads.c):


{{{
MRESULT EXPENTRY fnwpWorkerObject(HWND hwndObject, ULONG msg, MPARAM 
mp1, MPARAM mp2)
{
    MRESULT mrc = NULL;

    switch (msg)
    {
...
        case WOM_REFRESHFOLDERVIEWS:
        {
            XFolder     *pFolder = NULL,
                        *pCalling = (XFolder*)(mp1);

            for ( pFolder = _wpclsQueryOpenFolders(_WPFolder, NULL, QC_FIRST, FALSE);
                  pFolder;
                  pFolder = _wpclsQueryOpenFolders(_WPFolder, pFolder, QC_NEXT, FALSE))
            {
                if (    (wpshCheckObject(pFolder))
                     && (_somIsA(pFolder, _WPFolder))
                   )
                {
                    if (    (!pCalling)
                         || (wpshResidesBelow(pFolder, pCalling))
                       )
                    {
                        // folder applies:
                        fdrUpdateAllFrameWindows(pFolder, (ULONG)mp2);
                    }
                }
            }
            if (pCalling)
            {
               _wpModifyFolderFlags(pCalling,FOI_REFRESHINPROGRESS,0);
            }
        }
        break;
...
}}}


"	defect	closed	major	milestone1	component1	1.0	fixed		
