Changeset 1299


Ignore:
Timestamp:
Nov 29, 2008, 12:48:50 AM (16 years ago)
Author:
Gregg Young
Message:

Scan each drive on separate thread (added StubbyScanThread) to speed treecnr scans

Location:
trunk/dll
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/dll/filldir.c

    r1290 r1299  
    5353  19 Nov 08 SHL Correct and sanitize 4 pass scan logic
    5454  21 Nov 08 SHL FillTreeCnr: ensure any unchecked drives checked in pass 4
     55  24 Nov 08 GKY Add StubyScanThread to treecnr scan/rescan drives all on separate threads
     56  24 Nov 08 GKY Replace 4 pass drive scan code with StubyScanThread multithread scan
    5557
    5658***********************************************************************/
     
    6062#include <malloc.h>                     // _msize _heapchk
    6163#include <ctype.h>
     64#include <process.h>                    // _beginthread
    6265
    6366#define INCL_DOS
     
    8992#include "wrappers.h"                   // xDosFindNext
    9093#include "init.h"                       // GetTidForWindow
     94#include "common.h"                     // IncrThreadUsage
     95
     96VOID StubbyScanThread(VOID * arg);
    9197
    9298// Data definitions
     
    103109CHAR *FM3Tools;
    104110CHAR *WPProgram;
     111volatile INT  StubbyScanCount;
     112
     113typedef struct {
     114
     115  PCNRITEM    pci;
     116  HWND        hwndCnr;                //hwnd you want the message posted to
     117  HWND        hwndDrivesList;
     118  BOOL        RamDrive;
     119
     120}
     121STUBBYSCAN;
    105122
    106123/**
     
    160177  return apszAttrString[fileAttr];
    161178
     179}
     180
     181VOID StubbyScanThread(VOID * arg)
     182{
     183  STUBBYSCAN *StubbyScan;
     184  HAB thab;
     185  HMQ hmq = (HMQ) 0;
     186  BOOL ret;
     187
     188  DosError(FERR_DISABLEHARDERR);
     189
     190# ifdef FORTIFY
     191  Fortify_EnterScope();
     192#  endif
     193
     194  StubbyScan = (STUBBYSCAN *) arg;
     195  if (StubbyScan &&StubbyScan->pci && StubbyScan->pci->pszFileName && StubbyScan->hwndCnr) {
     196    thab = WinInitialize(0);
     197    if (thab) {
     198      hmq = WinCreateMsgQueue(thab, 0);
     199      if (hmq) {
     200        IncrThreadUsage();
     201        priority_normal();
     202        StubbyScanCount ++;
     203        ret = Stubby(StubbyScan->hwndCnr, StubbyScan->pci);
     204        if (ret == 0 && !StubbyScan->RamDrive) {
     205          if (WinIsWindow((HAB)0, StubbyScan->hwndCnr))
     206            WinSendMsg(StubbyScan->hwndCnr,
     207                       CM_INVALIDATERECORD,
     208                       MPFROMP(&StubbyScan->pci),
     209                       MPFROM2SHORT(1, CMA_ERASE | CMA_REPOSITION));
     210        }
     211        if (WinIsWindow((HAB)0, StubbyScan->hwndDrivesList))
     212          WinSendMsg(StubbyScan->hwndDrivesList,
     213                     LM_INSERTITEM,
     214                     MPFROM2SHORT(LIT_SORTASCENDING, 0),
     215                     MPFROMP(StubbyScan->pci->pszFileName));
     216        StubbyScanCount --;
     217        WinDestroyMsgQueue(hmq);
     218      }
     219      DecrThreadUsage();
     220      WinTerminate(thab);
     221    }
     222    free(StubbyScan);
     223  } // if StubbyScan
     224# ifdef FORTIFY
     225  Fortify_LeaveScope();
     226#  endif
     227
     228  _endthread();
    162229}
    163230
     
    11371204  BOOL drivesbuilt = FALSE;
    11381205  ULONG startdrive = 3;
    1139   static LONG whenToCheck[] = {
    1140     0,
    1141     DRIVE_REMOTE,
    1142     DRIVE_VIRTUAL,
    1143     DRIVE_SLOW};
    1144   USHORT checked[26] = { 0 };
    11451206  static BOOL didonce = FALSE;
    11461207
     
    14861547    }
    14871548  } // if show env
    1488   // Scan drives in 4 passes checking fastest to slowest
    1489   for (x = 0; x < 4; x++) {
     1549  {
     1550    STUBBYSCAN *StubbyScan;
     1551    HWND hwndDrivesList = WinWindowFromID(WinQueryWindow(hwndParent, QW_PARENT),
     1552                                          MAIN_DRIVELIST);
     1553
     1554    //AddDrive = TRUE;
    14901555    pci = (PCNRITEM) WinSendMsg(hwndCnr,
    1491                                 CM_QUERYRECORD,
    1492                                 MPVOID,
    1493                                 MPFROM2SHORT(CMA_FIRST, CMA_ITEMORDER));
     1556                                CM_QUERYRECORD,
     1557                                MPVOID,
     1558                                MPFROM2SHORT(CMA_FIRST, CMA_ITEMORDER));
     1559
    14941560    while (pci && (INT)pci != -1) {
     1561      StubbyScan = xmallocz(sizeof(STUBBYSCAN), pszSrcFile, __LINE__);
     1562      if (!StubbyScan)
     1563        break;
     1564      StubbyScan->pci = pci;
     1565      StubbyScan->hwndCnr = hwndCnr;
     1566      StubbyScan->hwndDrivesList = hwndDrivesList;
     1567      StubbyScan->RamDrive = FALSE;
    14951568      pciNext = (PCNRITEM) WinSendMsg(hwndCnr,
    1496                                       CM_QUERYRECORD,
    1497                                       MPFROMP(pci),
    1498                                       MPFROM2SHORT(CMA_NEXT, CMA_ITEMORDER));
     1569                                      CM_QUERYRECORD,
     1570                                      MPFROMP(pci),
     1571                                      MPFROM2SHORT(CMA_NEXT, CMA_ITEMORDER));
    14991572      if (~pci->flags & RECFLAGS_ENV) {
    1500         ULONG drvNum = toupper(*pci->pszFileName) - 'A';        // 0..25
    1501         if (drvNum == ulCurDriveNum || drvNum >= 2) {
    1502           ULONG flags = driveflags[drvNum];     // Speed up
    1503           if (~flags & DRIVE_INVALID &&
    1504               ~flags & DRIVE_NOPRESCAN &&
    1505               !checked[drvNum] &&
    1506               (!fNoRemovableScan || (~flags & DRIVE_REMOVABLE)) &&
    1507               (x == 3 ||
    1508                 (flags & (DRIVE_SLOW | DRIVE_VIRTUAL | DRIVE_REMOTE)) ==
    1509                   whenToCheck[x]))
    1510           {
    1511             if (!Stubby(hwndCnr, pci) && !DRIVE_RAMDISK) {
    1512               WinSendMsg(hwndCnr,
    1513                          CM_INVALIDATERECORD,
    1514                          MPFROMP(&pci),
    1515                          MPFROM2SHORT(1, CMA_ERASE | CMA_REPOSITION));
    1516               goto SkipBadRec;
    1517             }
    1518             checked[drvNum] = TRUE;
    1519           } // if this pass
    1520         }
    1521         else {
    1522           WinSendMsg(hwndCnr,
    1523                      CM_INVALIDATERECORD,
    1524                      MPFROMP(&pci),
    1525                      MPFROM2SHORT(1, CMA_ERASE | CMA_REPOSITION));
    1526         }
    1527         if (x == 0) {
    1528           // Add to drives drop down
    1529           WinSendMsg(WinWindowFromID(WinQueryWindow(hwndParent, QW_PARENT),
    1530                                      MAIN_DRIVELIST),
    1531                      LM_INSERTITEM,
    1532                      MPFROM2SHORT(LIT_SORTASCENDING, 0),
    1533                      MPFROMP(pci->pszFileName));
    1534         }
    1535       }
    1536     SkipBadRec:
     1573        ULONG drvNum = toupper(*pci->pszFileName) - 'A';        // 0..25
     1574        if (drvNum == ulCurDriveNum || drvNum >= 2) {
     1575          ULONG flags = driveflags[drvNum];     // Speed up
     1576          if (~flags & DRIVE_INVALID &&
     1577              ~flags & DRIVE_NOPRESCAN &&
     1578              (!fNoRemovableScan || ~flags & DRIVE_REMOVABLE))
     1579          {
     1580            if (DRIVE_RAMDISK)
     1581              StubbyScan->RamDrive = TRUE;
     1582            rc = _beginthread(StubbyScanThread, NULL, 65536, StubbyScan);
     1583            if (rc == -1)
     1584              Runtime_Error(pszSrcFile, __LINE__,
     1585                            GetPString(IDS_COULDNTSTARTTHREADTEXT));
     1586          } // if drive for scanning
     1587          else
     1588            WinSendMsg(hwndDrivesList,
     1589                       LM_INSERTITEM,
     1590                       MPFROM2SHORT(LIT_SORTASCENDING, 0),
     1591                       MPFROMP(pci->pszFileName));
     1592        }
     1593        else {
     1594          WinSendMsg(hwndCnr,
     1595                     CM_INVALIDATERECORD,
     1596                     MPFROMP(&pci),
     1597                     MPFROM2SHORT(1, CMA_ERASE | CMA_REPOSITION));
     1598          WinSendMsg(hwndDrivesList,
     1599                     LM_INSERTITEM,
     1600                     MPFROM2SHORT(LIT_SORTASCENDING, 0),
     1601                     MPFROMP(pci->pszFileName));
     1602        }
     1603      }
    15371604      pci = pciNext;
    15381605    } // while
    1539   } // for
     1606  }
    15401607  if (hwndParent)
    15411608    WinSendMsg(WinWindowFromID(WinQueryWindow(hwndParent, QW_PARENT),
     
    17031770  }
    17041771
    1705   // Catch extra calls to FreeCnrItemData
    1706   if (!pci->pszFileName)
    1707     DbgMsg(pszSrcFile, __LINE__, "FreeCnrItemData pci->pszFileName already NULL");
     1772  // 08 Sep 08 SHL Remove excess logic
     1773  if (pci->pszLongName && pci->pszLongName != NullStr) {
     1774    psz = pci->pszLongName;
     1775    pci->pszLongName = NULL;            // Catch illegal references
     1776    free(psz);
     1777  }
    17081778
    17091779  if (pci->pszFileName && pci->pszFileName != NullStr) {
     
    18021872          Dos_Error(MB_ENTER, apiret, HWND_DESKTOP, pszSrcFile, __LINE__,
    18031873                    "DosQueryMem failed pci %p pciLast %p", pci, pciLast);
    1804         FreeCnrItemData(pci);
     1874        FreeCnrItemData(pci);
    18051875        pciLast = pci;
    18061876        pci = (PCNRITEM)pci->rc.preccNextRecord;
     
    18251895
    18261896#pragma alloc_text(FILLDIR,FillInRecordFromFFB,FillInRecordFromFSA,IDFile)
    1827 #pragma alloc_text(FILLDIR1,ProcessDirectory,FillDirCnr,FillTreeCnr,FileAttrToString)
     1897#pragma alloc_text(FILLDIR1,ProcessDirectory,FillDirCnr,FillTreeCnr,FileAttrToString,StubbyScanThread)
    18281898#pragma alloc_text(EMPTYCNR,EmptyCnr,FreeCnrItemData,FreeCnrItem,FreeCnrItemList,RemoveCnrItems)
    18291899
  • TabularUnified trunk/dll/filldir.h

    r1207 r1299  
    5757extern HPOINTER hptrReadonly;
    5858extern HPOINTER hptrSystem;
     59extern volatile INT  StubbyScanCount;
    5960
    6061#endif // FILLDIR_H
  • TabularUnified trunk/dll/flesh.c

    r1207 r1299  
    2020  20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
    2121  29 Feb 08 GKY Use xfree where appropriate
     22  24 Nov 08 GKY remove redundant code and minor speed up of Stubby
    2223
    2324***********************************************************************/
     
    251252  BOOL isadir = FALSE, isremote = FALSE, includefiles = fFilesInTree;
    252253  ULONG ddepth = 3;
     254  ULONG drvNum;
     255  ULONG flags;
    253256  static BOOL brokenlan = FALSE, isbroken = FALSE;
    254257
     
    266269    MakeFullName(str);
    267270
     271  drvNum = toupper(*pciParent->pszFileName) - 'A';
     272  flags = driveflags[drvNum];
    268273  if (!isalpha(*str) ||
    269274      str[1] != ':' ||
    270       str[2] != '\\' || ((driveflags[toupper(*str) - 'A'] & DRIVE_IGNORE)))
     275      str[2] != '\\' || ((flags & DRIVE_IGNORE)))
    271276    return FALSE;
    272277
    273   if (isalpha(*str) && driveflags[toupper(*str) - 'A'] & DRIVE_INCLUDEFILES)
     278  //if (isalpha(*str) &&  // redundant check GKY 11/24/08
     279  if (flags & DRIVE_INCLUDEFILES)
    274280    includefiles = TRUE;
    275281
    276   if (!isalpha(*str) ||
     282  /*if (!isalpha(*str) ||   // redundant check GKY 11/24/08
    277283      str[1] != ':' ||
    278       str[2] != '\\' || ((driveflags[toupper(*str) - 'A'] & DRIVE_REMOTE)))
     284      str[2] != '\\' || */
     285  if (flags & DRIVE_REMOTE)
    279286    isremote = TRUE;
    280287
     
    429436      if (isadir) {
    430437
    431         PCNRITEM pci;
    432 
    433         pci = WinSendMsg(hwndCnr,
    434                          CM_ALLOCRECORD,
    435                          MPFROMLONG(EXTRA_RECORD_BYTES), MPFROMLONG(1));
    436         if (!pci) {
    437           Win_Error(hwndCnr, HWND_DESKTOP, __FILE__, __LINE__,
    438                     GetPString(IDS_RECORDALLOCFAILEDTEXT));
    439         }
    440         else {
    441           RECORDINSERT ri;
    442           pci->pszFileName = NullStr;
    443           pci->pszDisplayName = pci->pszFileName;
    444           pci->rc.pszIcon = pci->pszDisplayName;
    445           memset(&ri, 0, sizeof(RECORDINSERT));
    446           ri.cb = sizeof(RECORDINSERT);
    447           ri.pRecordOrder = (PRECORDCORE) CMA_END;
    448           ri.pRecordParent = (PRECORDCORE) pciParent;
    449           ri.zOrder = (ULONG) CMA_TOP;
    450           ri.cRecordsInsert = 1L;
    451           ri.fInvalidateRecord = TRUE;
    452           if (!WinSendMsg(hwndCnr,
    453                           CM_INSERTRECORD, MPFROMP(pci), MPFROMP(&ri))) {
    454             DosSleep(50); //05 Aug 07 GKY 100
    455             WinSetFocus(HWND_DESKTOP, hwndCnr);
    456             if (WinIsWindow((HAB)0, hwndCnr)) {
    457               if (!WinSendMsg(hwndCnr,
    458                               CM_INSERTRECORD, MPFROMP(pci), MPFROMP(&ri))) {
    459                 Win_Error(hwndCnr, HWND_DESKTOP, __FILE__, __LINE__,
    460                           GetPString(IDS_RECORDINSERTFAILEDTEXT));
    461                 FreeCnrItem(hwndCnr, pci);
    462               }
    463               else
    464                 ret = TRUE;
    465             }
    466           }
    467           else
    468             ret = TRUE;
    469         }
     438        PCNRITEM pci;
     439
     440        if (WinIsWindow((HAB)0, hwndCnr)) {
     441          pci = WinSendMsg(hwndCnr,
     442                           CM_ALLOCRECORD,
     443                           MPFROMLONG(EXTRA_RECORD_BYTES), MPFROMLONG(1));
     444          if (!pci) {
     445            Win_Error(hwndCnr, HWND_DESKTOP, __FILE__, __LINE__,
     446                      GetPString(IDS_RECORDALLOCFAILEDTEXT));
     447          }
     448          else {
     449            RECORDINSERT ri;
     450            pci->pszFileName = NullStr;
     451            pci->pszDisplayName = pci->pszFileName;
     452            pci->rc.pszIcon = pci->pszDisplayName;
     453            memset(&ri, 0, sizeof(RECORDINSERT));
     454            ri.cb = sizeof(RECORDINSERT);
     455            ri.pRecordOrder = (PRECORDCORE) CMA_END;
     456            ri.pRecordParent = (PRECORDCORE) pciParent;
     457            ri.zOrder = (ULONG) CMA_TOP;
     458            ri.cRecordsInsert = 1L;
     459            ri.fInvalidateRecord = TRUE;
     460            if (!WinSendMsg(hwndCnr,
     461                            CM_INSERTRECORD, MPFROMP(pci), MPFROMP(&ri))) {
     462              DosSleep(50); //05 Aug 07 GKY 100
     463              WinSetFocus(HWND_DESKTOP, hwndCnr);
     464              if (WinIsWindow((HAB)0, hwndCnr)) {
     465                if (!WinSendMsg(hwndCnr,
     466                                CM_INSERTRECORD, MPFROMP(pci), MPFROMP(&ri))) {
     467                  Win_Error(hwndCnr, HWND_DESKTOP, __FILE__, __LINE__,
     468                            GetPString(IDS_RECORDINSERTFAILEDTEXT));
     469                  FreeCnrItem(hwndCnr, pci);
     470                }
     471                else
     472                  ret = TRUE;
     473              }
     474            }
     475            else
     476              ret = TRUE;
     477          }
     478        }
    470479      }
    471480      else if (toupper(*str) > 'B' && str[1] == ':' && str[2] == '\\' &&
  • TabularUnified trunk/dll/treecnr.c

    r1277 r1299  
    806806      WinSendMsg(dcd->hwndCnr,
    807807                 CM_SCROLLWINDOW,
    808                  MPFROMSHORT(CMA_HORIZONTAL), MPFROMLONG(-1));
     808                 MPFROMSHORT(CMA_HORIZONTAL), MPFROMLONG(-1));
     809      while (StubbyScanCount !=0)
     810        DosSleep(100);
    809811      FillTreeCnr(dcd->hwndCnr, dcd->hwndParent);
    810812      if (fOkayMinimize) {
     
    16891691          BOOL wasFollowing;
    16901692
    1691           DosEnterCritSec();
     1693          //DosEnterCritSec(); //GKY 11-28-08
    16921694          wasFollowing = fFollowTree;
    16931695          fFollowTree = FALSE;
    1694           DosExitCritSec();
     1696          //DosExitCritSec();
    16951697          if (pci && (INT) pci != -1 && !(pci->flags & RECFLAGS_ENV)) {
    16961698            WinSendMsg(hwnd,
     
    17301732            }
    17311733          }
    1732           DosEnterCritSec();
     1734          //DosEnterCritSec(); //GKY 11-28-08
    17331735          fFollowTree = wasFollowing;
    1734           DosExitCritSec();
     1736          //DosExitCritSec();
    17351737        }
    17361738        break;
Note: See TracChangeset for help on using the changeset viewer.