Changeset 1268


Ignore:
Timestamp:
Oct 31, 2008, 4:19:47 AM (16 years ago)
Author:
Gregg Young
Message:

Added a thread to monitor completion of unarchive to send message to open viewer fix memory allocate/free issues. It appears that it fixes ticket 58

Location:
trunk/dll
Files:
3 edited

Legend:

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

    r1242 r1268  
    158158ULONGLONG ullDATFileSpaceNeeded;
    159159
     160typedef struct {
     161
     162  CHAR filename[CCHMAXPATH];
     163  HWND hwndCnr;
     164}
     165WAITCHILD;
     166
     167VOID WaitChildThread(VOID * arg)
     168{
     169  WAITCHILD *WaitChild;
     170  ULONG clPosted;
     171  HAB thab;
     172  CHAR *filename;
     173
     174  DosError(FERR_DISABLEHARDERR);
     175
     176# ifdef FORTIFY
     177  Fortify_EnterScope();
     178#  endif
     179
     180  WaitChild = (WAITCHILD *) arg;
     181  if (WaitChild) {
     182    filename = xstrdup(WaitChild->filename, pszSrcFile, __LINE__);
     183    thab = WinInitialize(0);
     184    if (thab) {
     185      IncrThreadUsage();
     186      priority_normal();
     187      DosWaitEventSem(hWaitChildSem, SEM_INDEFINITE_WAIT);
     188      priority_bumped();
     189      DosResetEventSem(hWaitChildSem, &clPosted);
     190      if (IsFile(WaitChild->filename) == 1)
     191        PostMsg(WaitChild->hwndCnr, UM_ENTER, MPFROMP(filename), MPVOID);
     192      DecrThreadUsage();
     193      WinTerminate(thab);
     194    }
     195    free(WaitChild);
     196  } // if WaitChild
     197# ifdef FORTIFY
     198  Fortify_LeaveScope();
     199#  endif
     200  _endthread();
     201}
     202
    160203static MRESULT EXPENTRY ArcErrProc(HWND hwnd, ULONG msg, MPARAM mp1,
    161204                                   MPARAM mp2)
     
    593636          }
    594637          else {
    595             runemf2(SEPARATE | INVISIBLE | FULLSCREEN | BACKGROUND | WAIT,
     638            runemf2(SEPARATE | INVISIBLE | MINIMIZED | BACKGROUND | WAIT,
    596639                    hwndCnr, pszSrcFile, __LINE__, NULL, NULL,
    597640                    "%s %s",
     
    13841427          }
    13851428          // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"%s %s %s\r[%s]",dcd->info->extract,dcd->arcname,membername,construct);
    1386           runemf2(SEPARATE | WINDOWED | WAIT |
     1429          runemf2(SEPARATE | WINDOWED | ASYNCHRONOUS | WAIT |
    13871430                  (fArcStuffVisible ? 0 : BACKGROUND | MINIMIZED),
    13881431                  dcd->hwndClient, pszSrcFile, __LINE__, construct, NULL,
     
    15031546    if (dcd) {
    15041547
    1505       CHAR *s = (CHAR *) mp1, *p, *pp, filename[CCHMAXPATH];
    1506 
     1548      CHAR *s = (CHAR *) mp1, *p, *pp; // filename[CCHMAXPATH];
     1549      WAITCHILD *WaitChild;
     1550      APIRET rc;
     1551
     1552      WaitChild = xmallocz(sizeof(WAITCHILD), pszSrcFile, __LINE__);
     1553      if (!WaitChild)
     1554        return 0;
    15071555      if (s) {
    15081556        if (!dcd->info->extract) {
     
    15111559          return 0;
    15121560        }
    1513         runemf2(SEPARATE | WINDOWED | WAIT |
    1514                 (fArcStuffVisible ? 0 : BACKGROUND | MINIMIZED),
     1561        runemf2(SEPARATE | ASYNCHRONOUS | WAIT |
     1562                (fArcStuffVisible ? 0 : BACKGROUND),
    15151563                dcd->hwndClient, pszSrcFile, __LINE__, dcd->workdir, NULL,
    15161564                "%s %s %s",
     
    15301578            memmove(s, p + 1, strlen(p + 1));
    15311579        }
    1532         sprintf(filename, "%s\\%s", dcd->workdir, s);
    1533         p = filename;
     1580        sprintf(WaitChild->filename, "%s\\%s", dcd->workdir, s);
     1581        p = WaitChild->filename;
    15341582        while (*p) {
    15351583          if (*p == '/')
     
    15371585          p++;
    15381586        }
    1539         // printf("%s %d UM_ENTER %s %s\n",__FILE__, __LINE__,filename, s); fflush(stdout);     // 10 Mar 07 SHL hang
    1540         free(s);
    1541         if (IsFile(filename) == 1) {
    1542 #if 1 // 06 Oct 07 SHL fixme to be gone - set to 0 for ticket #58 testing
     1587        //printf("%s %d UM_ENTER %s %x\n",__FILE__, __LINE__,WaitChild->filename, dcd->hwndCnr); fflush(stdout);        // 10 Mar 07 SHL hang
     1588        free(s);
     1589        WaitChild->hwndCnr = dcd->hwndCnr;
     1590        rc = _beginthread(WaitChildThread, NULL, 65536, WaitChild);
     1591        if (rc == -1)
     1592          Runtime_Error(pszSrcFile, __LINE__,
     1593                        GetPString(IDS_COULDNTSTARTTHREADTEXT));
     1594        //if (IsFile(filename) == 1) {
     1595#if 0 // 06 Oct 07 SHL fixme to be gone - set to 0 for ticket #58 testing
    15431596          if (fViewChild && fArcStuffVisible)
    15441597            DosSleep(100);  // Allow unzip session to finish closing 14 Mar 07 SHL
    15451598#endif
    1546           WinSendMsg(dcd->hwndCnr, UM_ENTER, MPFROMP(filename), MPVOID);
    1547         }
     1599          //DosWaitEventSem(hWaitChildSem, SEM_INDEFINITE_WAIT);
     1600          //WinSendMsg(WaitChild->hwndCnr, UM_ENTER, MPFROMP(WaitChild->filename), MPVOID);
     1601
    15481602      }
    15491603    }
     
    16101664              if (!li->list[x] || strlen(szBuffer) +
    16111665                  strlen(li->list[x]) + 5 > MaxComLineStrg) {
    1612                 runemf2(SEPARATE | WINDOWED |
    1613                         (fArcStuffVisible ? 0 : BACKGROUND | MINIMIZED) |
    1614                         WAIT, hwnd, pszSrcFile, __LINE__,
     1666                runemf2(SEPARATE | WINDOWED | ASYNCHRONOUS |
     1667                        (fArcStuffVisible ? 0 : BACKGROUND | MINIMIZED),
     1668                        hwnd, pszSrcFile, __LINE__,
    16151669                        NULL, NULL, "%s", szBuffer);
    16161670                *p = 0;
     
    16761730              }
    16771731              z = x;
    1678               runemf2(SEPARATE | WINDOWED | WAIT |
     1732              runemf2(SEPARATE | WINDOWED | ASYNCHRONOUS | WAIT |
    16791733                      (fArcStuffVisible ? 0 : BACKGROUND | MINIMIZED),
    16801734                      hwnd, pszSrcFile, __LINE__, NullStr, NULL, "%s", pszCmdLine);
     
    18021856              }
    18031857              z = x;
    1804               runemf2(SEPARATE | WINDOWED |
    1805                       (fArcStuffVisible ? 0 : BACKGROUND | MINIMIZED) |
    1806                       WAIT, hwnd, pszSrcFile, __LINE__,
     1858              runemf2(SEPARATE | WINDOWED | ASYNCHRONOUS |
     1859                      (fArcStuffVisible ? 0 : BACKGROUND | MINIMIZED),
     1860                      hwnd, pszSrcFile, __LINE__,
    18071861                      li->targetpath, NULL, "%s", pszCmdLine);
    18081862              *endofit = 0;
     
    25542608
    25552609  case UM_ENTER:
    2556     if (WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID))
     2610    if (WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID)) {
     2611      free(mp1);
    25572612      return 0;
     2613    }
    25582614    SetShiftState();
    25592615    if (dcd && (CHAR *) mp1) {
     
    25612617      SWP swp;
    25622618      CHAR *filename = mp1;
    2563 
    2564       if (IsFile(filename) != 1)
    2565         return 0;
     2619      printf("%s %d UM_ENTER %s\n",__FILE__, __LINE__, filename); fflush(stdout);
     2620      if (IsFile(filename) != 1) {
     2621        free(mp1);
     2622        return 0;
     2623      }
    25662624      WinQueryWindowPos(dcd->hwndFrame, &swp);
    25672625      DefaultViewKeys(hwnd, dcd->hwndFrame, dcd->hwndParent, &swp, filename);
     
    25692627        UnHilite(hwnd, FALSE, &dcd->lastselection, 0);
    25702628    }
     2629    free(mp1);
    25712630    return 0;
    25722631
     
    29132972      case IDM_ARCEXTRACT:
    29142973        if (dcd->info->extract)
    2915           runemf2(SEPARATE | WINDOWED |
     2974          runemf2(SEPARATE | WINDOWED | ASYNCHRONOUS |
    29162975                  (fArcStuffVisible ? 0 : BACKGROUND | MINIMIZED),
    29172976                  hwnd, pszSrcFile, __LINE__,
     
    29252984      case IDM_ARCEXTRACTWDIRS:
    29262985        if (dcd->info->exwdirs)
    2927           runemf2(SEPARATE | WINDOWED |
     2986          runemf2(SEPARATE | WINDOWED | ASYNCHRONOUS |
    29282987                  (fArcStuffVisible ? 0 : BACKGROUND | MINIMIZED),
    29292988                  hwnd, pszSrcFile, __LINE__,
  • TabularUnified trunk/dll/systemf.c

    r1252 r1268  
    6060
    6161static PSZ pszSrcFile = __FILE__;
     62
     63HEV hWaitChildSem;
    6264
    6365//static HAPP Exec(HWND hwndNotify, BOOL child, char *startdir, char *env,
     
    690692  static char szTermQName[30];
    691693  static HQUEUE hTermQ;
    692   static HEV hTermQSem;
     694  //static HEV hTermQSem;
    693695
    694696  if (pszDirectory && *pszDirectory) {
     
    10781080          }
    10791081          else {
    1080             rc = DosCreateEventSem(NULL,(PHEV)&hTermQSem,0,FALSE);
     1082            rc = DosCreateEventSem(NULL,(PHEV)&hWaitChildSem,0,FALSE);
    10811083            if (rc) {
    1082                 hTermQSem = (HEV)0;     // Try to survive
     1084                hWaitChildSem = (HEV)0;     // Try to survive
    10831085                DosCloseQueue(hTermQ);
    10841086                hTermQ = (HQUEUE)0;     // Try to survive
    10851087                DosExitCritSec();
    1086                 Dos_Error(MB_ENTER,rc,HWND_DESKTOP,pszSrcFile,__LINE__,"DoCreateEventSem");
     1088                Dos_Error(MB_ENTER,rc,HWND_DESKTOP,pszSrcFile,__LINE__,"DosCreateEventSem");
    10871089            }
    10881090            // if (!rc) fprintf(stderr,"%s %d qcreated ptib %x hTermQ %x\n",__FILE__, __LINE__,ptib,hTermQ);
    10891091          }
    10901092        } // if 1st time
    1091         useTermQ = hTermQ && hTermQSem;
     1093        useTermQ = hTermQ && hWaitChildSem;
    10921094        if (!rc)
    10931095          DosExitCritSec();
     
    11301132      //     sdata.PgmInputs, sdata.TermQ, sdata.InheritOpt,
    11311133      //   sdata.SessionType, szTermQName,
    1132       //   hTermQ, hTermQSem); fflush(stdout);
     1134      //   hTermQ, hWaitChildSem); fflush(stdout);
    11331135      ret = DosStartSession(&sdata, &ulSessID, &sessPID);
    11341136
     
    11681170            if (DosSetSession(ulSessID, &sd))   // Check if session gone (i.e. finished)
    11691171              break;
    1170             if (ctr > 10) {
     1172            if (ctr > 20) {
    11711173              //   printf("%s %d thread 0x%x showing slow sess %u pid 0x%x\n",
    11721174              //        __FILE__, __LINE__,ptib->tib_ordinal,ulSessID,sessPID); fflush(stdout); // 12 Mar 07 SHL
     
    11811183            if (ctr < 20) {
    11821184              rc = DosReadQueue(hTermQ, &rq, &ulLength, (PPVOID)&pTermInfo, 0,
    1183                                 DCWW_NOWAIT, &bPriority, hTermQSem);
     1185                                DCWW_NOWAIT, &bPriority, hWaitChildSem);
    11841186              if (rc == ERROR_QUE_EMPTY) {
    11851187                DosSleep(50);//05 Aug 07 GKY 100
     
    12041206            }
    12051207
    1206             //  printf("%s %d DosReadQueue thread 0x%x sess %u sessRC %u rq.pid 0x%x rq.data 0x%x\n",
    1207             //       __FILE__, __LINE__,ptib->tib_ordinal,pTermInfo->usSessID,pTermInfo->usRC,rq.pid, rq.ulData); fflush(stdout);
    1208 
    1209             if (pTermInfo->usSessID == ulSessID)
    1210               break;                    // Our session is done
     1208              //printf("%s %d DosReadQueue thread 0x%x sess %u sessRC %u rq.pid 0x%x rq.data 0x%x\n",
     1209              //     __FILE__, __LINE__,ptib->tib_ordinal,pTermInfo->usSessID,pTermInfo->usRC,rq.pid, rq.ulData); fflush(stdout);
     1210
     1211            if (pTermInfo->usSessID == ulSessID) {
     1212              DosPostEventSem(hWaitChildSem);
     1213                break;                    // Our session is done
     1214            }
    12111215
    12121216            // Requeue session for other thread
  • TabularUnified trunk/dll/systemf.h

    r1227 r1268  
    4848EXECARGS;
    4949
     50extern HEV hWaitChildSem;
     51
    5052INT ExecOnList(HWND hwnd, CHAR * command, INT flags, CHAR * tpath,
    5153               CHAR ** list, CHAR * prompt, PCSZ pszCallingFile, UINT uiLineNumber);
Note: See TracChangeset for help on using the changeset viewer.