Changeset 783 for trunk/dll/seeall.c


Ignore:
Timestamp:
Aug 14, 2007, 6:09:54 AM (18 years ago)
Author:
Steven Levine
Message:

Rework DosFindFirst/Next loops to optimize memory allocation and code paths
Adjust FilesToGet limits
Update configuration notebook scanning page
Start updating #pragma alloc_text positioning for OpenWatcom compatibility

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/seeall.c

    r775 r783  
    2222  03 Nov 06 SHL Count thread usage
    2323  30 Mar 07 GKY Remove GetPString for window class names
    24   03 Aug 07 GKY Enlarged and made setable everywhere Findbuf (speed file loading)
     24  03 Aug 07 GKY Enlarged and made setable everywhere Findbuf (speeds file loading)
    2525  06 Aug 07 GKY Reduce DosSleep times (ticket 148)
    2626  07 Aug 07 SHL Use BldQuotedFullPathName and BldQuotedFileName
     27  13 Aug 07 SHL Sync code with other FilesToGet usage
     28  13 Aug 07 SHL Move #pragma alloc_text to end for OpenWatcom compat
    2729
    2830***********************************************************************/
     
    4850
    4951static PSZ pszSrcFile = __FILE__;
    50 
    51 #pragma alloc_text(SEEALL,comparefullnames,comparenames,comparesizes)
    52 #pragma alloc_text(SEEALL,comparedates,compareexts,SeeStatusProc)
    53 #pragma alloc_text(SEEALL,InitWindow,PaintLine,SeeAllWndProc)
    54 #pragma alloc_text(SEEALL,UpdateList,CollectList,ReSort,Mark)
    55 #pragma alloc_text(SEEALL,BuildAList,RemoveDeleted,SeeFrameWndProc,FilterList)
    56 #pragma alloc_text(SEEALL2,SeeObjWndProc,MakeSeeObjWinThread,FindDupes,DupeDlgProc)
    57 #pragma alloc_text(SEEALL3,FreeAllFilesList,DoADir,FindAllThread,AFDrvsWndProc)
    58 #pragma alloc_text(SEEALL3,StartSeeAll)
    5952
    6053typedef struct
     
    726719                  // Assume <2GB since file did not fit
    727720                  clFreeBytes = fsa.cUnitAvail * fsa.cSectorUnit *
    728                     fsa.cbSector;
     721                                fsa.cbSector;
    729722                  if (clFreeBytes) {
    730723                    // Find item that will fit in available space
     
    14131406}
    14141407
    1415 static BOOL UpdateList(HWND hwnd, CHAR ** list)
     1408static BOOL UpdateList(HWND hwnd, CHAR **list)
    14161409{
    14171410  /* Updates files in the list */
    14181411
    14191412  ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
    1420   register ULONG x, z;
     1413  ULONG x, z;
    14211414  BOOL ret, didone = FALSE;
    14221415  FILEFINDBUF3 ffb;
    1423   ULONG nm;
     1416  ULONG ulFindCnt;
    14241417  HDIR hdir;
    14251418  CHAR *p;
     
    14371430        didone = TRUE;
    14381431        hdir = HDIR_CREATE;
    1439         nm = 1;
     1432        ulFindCnt = 1;
    14401433        if (!DosFindFirst(list[z], &hdir, FILE_NORMAL | FILE_ARCHIVED |
    14411434                          FILE_DIRECTORY | FILE_READONLY | FILE_SYSTEM |
    1442                           FILE_HIDDEN, &ffb, sizeof(ffb), &nm,
     1435                          FILE_HIDDEN, &ffb, sizeof(ffb), &ulFindCnt,
    14431436                          FIL_STANDARD)) {
    14441437          DosFindClose(hdir);
     
    14581451        didone = TRUE;
    14591452        hdir = HDIR_CREATE;
    1460         nm = 1;
     1453        ulFindCnt = 1;
    14611454        if (!DosFindFirst(list[z], &hdir, FILE_NORMAL | FILE_ARCHIVED |
    14621455                          FILE_DIRECTORY | FILE_READONLY | FILE_SYSTEM |
    1463                           FILE_HIDDEN, &ffb, sizeof(ffb), &nm,
     1456                          FILE_HIDDEN, &ffb, sizeof(ffb), &ulFindCnt,
    14641457                          FIL_STANDARD)) {
    14651458          DosFindClose(hdir);
     
    18931886  ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
    18941887  CHAR *filename, *enddir;
    1895   FILEFINDBUF3 *pffb, *ffb;
     1888  PFILEFINDBUF3 pffbArray, pffbFile;
    18961889  HDIR hdir = HDIR_CREATE;
    1897   ULONG nm, uL;
    1898   register ULONG x;
    1899   register PBYTE fb;
     1890  ULONG ulFindCnt;
     1891  ULONG ulFindMax;
     1892  ULONG ulBufBytes;
     1893  ULONG x;
     1894  APIRET rc;
    19001895
    19011896  filename = xmalloc(CCHMAXPATH, pszSrcFile, __LINE__);
     
    19031898    return;
    19041899
    1905   uL = ad->afFilesToGet;
     1900  ulFindMax = ad->afFilesToGet;
    19061901  if (fRemoteBug && isalpha(*pathname) && pathname[1] == ':' &&
    19071902      pathname[2] == '\\' &&
    19081903      (driveflags[toupper(*pathname) - 'A'] & DRIVE_REMOTE))
    1909     uL = 1;
    1910   pffb = xmalloc(sizeof(FILEFINDBUF3) * uL, pszSrcFile, __LINE__);
    1911   if (!pffb) {
     1904    ulFindMax = 1;
     1905
     1906  ulBufBytes = sizeof(FILEFINDBUF3) * ulFindMax;
     1907  pffbArray = xmalloc(ulBufBytes, pszSrcFile, __LINE__);
     1908  if (!pffbArray) {
    19121909    free(filename);
    19131910    return;
    19141911  }
    1915   nm = uL;
     1912
    19161913  strcpy(filename, pathname);
    19171914  enddir = &filename[strlen(filename) - 1];
     
    19231920  strcpy(enddir, "*");
    19241921  DosError(FERR_DISABLEHARDERR);
    1925   if (!DosFindFirst(filename, &hdir, FILE_NORMAL | FILE_ARCHIVED |
     1922  ulFindCnt = ulFindMax;
     1923  rc = DosFindFirst(filename, &hdir, FILE_NORMAL | FILE_ARCHIVED |
    19261924                    FILE_READONLY | FILE_DIRECTORY | FILE_SYSTEM |
    1927                     FILE_HIDDEN, pffb, sizeof(FILEFINDBUF3) * nm, &nm,
    1928                     FIL_STANDARD)) {
     1925                    FILE_HIDDEN,
     1926                    pffbArray, ulBufBytes, &ulFindCnt, FIL_STANDARD);
     1927  if (!rc) {
    19291928    do {
     1929#if 0 // 13 Aug 07 SHL fixme to be gone
     1930      {
     1931        static ULONG ulMaxCnt = 1;
     1932        if (ulFindCnt > ulMaxCnt) {
     1933          ulMaxCnt = ulFindCnt;
     1934          DbgMsg(pszSrcFile, __LINE__, "ulMaxCnt %u/%u", ulMaxCnt, ulFindMax);
     1935        }
     1936      }
     1937#endif // fixme to be gone
    19301938      priority_normal();
    1931       fb = (PBYTE) pffb;
    1932       for (x = 0; x < nm; x++) {
    1933         ffb = (FILEFINDBUF3 *) fb;
    1934         if (ffb->attrFile & FILE_DIRECTORY) {
     1939      pffbFile = pffbArray;
     1940      for (x = 0; x < ulFindCnt; x++) {
     1941        if (pffbFile->attrFile & FILE_DIRECTORY) {
    19351942          // Skip . and ..
    1936           if (ffb->achName[0] != '.' ||
    1937               (ffb->achName[1] &&
    1938                (ffb->achName[1] != '.' || ffb->achName[2]))) {
    1939             strcpy(enddir, ffb->achName);
     1943          if (pffbFile->achName[0] != '.' ||
     1944              (pffbFile->achName[1] &&
     1945               (pffbFile->achName[1] != '.' || pffbFile->achName[2]))) {
     1946            strcpy(enddir, pffbFile->achName);
    19401947            DoADir(hwnd, filename);
    19411948          }
     
    19431950        else {
    19441951          *enddir = 0;
    1945           strcpy(enddir, ffb->achName);
     1952          strcpy(enddir, pffbFile->achName);
    19461953          if (!ad->afalloc || ad->affiles > ad->afalloc - 1) {
    19471954
     
    19701977            ad->afhead[ad->affiles].filename =
    19711978              ad->afhead[ad->affiles].fullname + (enddir - filename);
    1972             ad->afhead[ad->affiles].cbFile = ffb->cbFile;
    1973             ad->afhead[ad->affiles].date = ffb->fdateLastWrite;
    1974             ad->afhead[ad->affiles].time = ffb->ftimeLastWrite;
    1975             ad->afhead[ad->affiles].attrFile = (USHORT) ffb->attrFile;
     1979            ad->afhead[ad->affiles].cbFile = pffbFile->cbFile;
     1980            ad->afhead[ad->affiles].date = pffbFile->fdateLastWrite;
     1981            ad->afhead[ad->affiles].time = pffbFile->ftimeLastWrite;
     1982            ad->afhead[ad->affiles].attrFile = (USHORT) pffbFile->attrFile;
    19761983            ad->afhead[ad->affiles].flags = 0;
    19771984            ad->affiles++;
    1978             if (ad->longest < ffb->cchName)
    1979               ad->longest = ffb->cchName;
    1980             if (ad->longestw < ffb->cchName + (enddir - filename))
    1981               ad->longestw = ffb->cchName + (enddir - filename);
    1982           }
    1983         }
    1984         fb += ffb->oNextEntryOffset;
    1985       }
    1986       nm = uL;
    1987     } while (!ad->stopflag &&
    1988              !DosFindNext(hdir, pffb, sizeof(FILEFINDBUF3) * nm, &nm));
     1985            if (ad->longest < pffbFile->cchName)
     1986              ad->longest = pffbFile->cchName;
     1987            if (ad->longestw < pffbFile->cchName + (enddir - filename))
     1988              ad->longestw = pffbFile->cchName + (enddir - filename);
     1989          }
     1990        }
     1991        pffbFile = (PFILEFINDBUF3)((PBYTE)pffbFile + pffbFile->oNextEntryOffset);
     1992      } // for
     1993      if (ad->stopflag)
     1994        break;
     1995      ulFindCnt = ulFindMax;
     1996      rc = DosFindNext(hdir, pffbArray, sizeof(FILEFINDBUF3) * ulFindCnt, &ulFindCnt);
     1997    } while (!rc);
    19891998    DosFindClose(hdir);
    19901999  }
    1991   free(pffb);
     2000
     2001  if (rc && rc != ERROR_NO_MORE_FILES) {
     2002    Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
     2003              GetPString(IDS_CANTFINDDIRTEXT), filename);
     2004  }
     2005
     2006  free(pffbArray);
    19922007  free(filename);
    19932008}
     
    22162231                      RECTL * Rectl)
    22172232{
    2218 
    22192233  ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
    22202234  POINTL ptl;
     
    38023816
    38033817  case WM_COMMAND:
    3804     if (!pAD)
     3818    if (!pAD) {
     3819      Runtime_Error(pszSrcFile, __LINE__, "no data");
    38053820      return 0;
     3821    }
    38063822    switch (SHORT1FROMMP(mp1)) {
    38073823    case IDM_SETTARGET:
     
    42724288  return hwndFrame;
    42734289}
     4290
     4291#pragma alloc_text(SEEALL,comparefullnames,comparenames,comparesizes)
     4292#pragma alloc_text(SEEALL,comparedates,compareexts,SeeStatusProc)
     4293#pragma alloc_text(SEEALL,InitWindow,PaintLine,SeeAllWndProc)
     4294#pragma alloc_text(SEEALL,UpdateList,CollectList,ReSort,Mark)
     4295#pragma alloc_text(SEEALL,BuildAList,RemoveDeleted,SeeFrameWndProc,FilterList)
     4296#pragma alloc_text(SEEALL2,SeeObjWndProc,MakeSeeObjWinThread,FindDupes,DupeDlgProc)
     4297#pragma alloc_text(SEEALL3,FreeAllFilesList,DoADir,FindAllThread,AFDrvsWndProc)
     4298#pragma alloc_text(SEEALL3,StartSeeAll)
     4299
Note: See TracChangeset for help on using the changeset viewer.