Changeset 562 for trunk/dll/systemf.c


Ignore:
Timestamp:
Mar 15, 2007, 1:13:12 AM (18 years ago)
Author:
Gregg Young
Message:

Fixed arc viewer hang

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/systemf.c

    r552 r562  
    623623  STARTDATA sdata;
    624624  REQUESTDATA rq;
    625   ULONG ulSessID, apptype, ulLength, ctr;
     625  ULONG ulSessID;
     626  ULONG ulLength;
     627  UINT ctr;
     628  ULONG ulAppType;
    626629  PID sessPID;
    627630  BOOL wasquote;
     
    776779          switch_to(pszDirectory);
    777780        }
    778         rc = DosQAppType(pszPgm,&apptype);
     781        rc = DosQueryAppType(pszPgm,&ulAppType);
    779782        if (!strchr(pszPgm, '\\') &&
    780783            !strchr(pszPgm, ':') &&
     
    783786          switch_to(szSavedir);
    784787        if (rc) {
    785           Dos_Error(MB_CANCEL,rc,hwnd,pszSrcFile,__LINE__,
    786                     GetPString(IDS_DOSQAPPTYPEFAILEDTEXT),
    787                     pszPgm);
     788          Dos_Error(MB_CANCEL,rc,hwnd,pszSrcFile,__LINE__,
     789                    GetPString(IDS_DOSQAPPTYPEFAILEDTEXT),
     790                    pszPgm);
    788791          DosFreeMem(pszPgm);
    789792          if (pszArgs)
     
    791794          return -1;
    792795        }
    793         if (apptype) {
    794           if ((apptype & FAPPTYP_DLL) || (apptype & FAPPTYP_VIRTDRV) ||
    795               (apptype & FAPPTYP_PHYSDRV) || (apptype & FAPPTYP_PROTDLL))
     796        if (ulAppType) {
     797          if (ulAppType & FAPPTYP_DLL || ulAppType & FAPPTYP_VIRTDRV ||
     798              ulAppType & FAPPTYP_PHYSDRV || ulAppType & FAPPTYP_PROTDLL)
    796799          {
    797             Runtime_Error(pszSrcFile, __LINE__,
    798                           GetPString(IDS_APPTYPEUNEXPECTEDTEXT),
    799                           apptype, pszPgm);
     800            Runtime_Error(pszSrcFile, __LINE__,
     801                          GetPString(IDS_APPTYPEUNEXPECTEDTEXT),
     802                          ulAppType, pszPgm);
    800803            if (pszPgm)
    801804              DosFreeMem(pszPgm);
     
    804807            return -1;
    805808          }
    806           if ((apptype & FAPPTYP_DOS) || (apptype & FAPPTYP_WINDOWSREAL) ||
    807               (apptype & FAPPTYP_WINDOWSPROT) || (apptype & 0x1000))
     809          if (ulAppType & FAPPTYP_DOS || ulAppType & FAPPTYP_WINDOWSREAL ||
     810              ulAppType & FAPPTYP_WINDOWSPROT || ulAppType & FAPPTYP_WINDOWSPROT31)
    808811          {
    809             Runtime_Error(pszSrcFile, __LINE__,
    810                           GetPString(IDS_APPTYPEUNEXPECTEDTEXT),
    811                           apptype, pszPgm);
     812            Runtime_Error(pszSrcFile, __LINE__,
     813                          GetPString(IDS_APPTYPEUNEXPECTEDTEXT),
     814                          ulAppType, pszPgm);
    812815            if (pszPgm)
    813816              DosFreeMem(pszPgm);
     
    912915        switch_to(pszDirectory);
    913916      }
    914       rc = DosQAppType(pszPgm,&apptype);
     917      rc = DosQueryAppType(pszPgm,&ulAppType);
    915918      if (!strchr(pszPgm, '\\') &&
    916919          !strchr(pszPgm, ':') &&
     
    919922        switch_to(szSavedir);
    920923      if (rc) {
    921         Dos_Error(MB_CANCEL,rc,hwnd,pszSrcFile,__LINE__,
    922                   GetPString(IDS_DOSQAPPTYPEFAILEDTEXT),
    923                   pszPgm);
     924        Dos_Error(MB_CANCEL,rc,hwnd,pszSrcFile,__LINE__,
     925                  GetPString(IDS_DOSQAPPTYPEFAILEDTEXT),
     926                  pszPgm);
    924927        DosFreeMem(pszPgm);
    925928        if (pszArgs)
     
    928931      }
    929932
    930       if (apptype) {
    931         if (apptype & (FAPPTYP_DLL | FAPPTYP_VIRTDRV | FAPPTYP_PHYSDRV | FAPPTYP_PROTDLL))
     933      if (ulAppType) {
     934        if (ulAppType & (FAPPTYP_DLL | FAPPTYP_VIRTDRV | FAPPTYP_PHYSDRV | FAPPTYP_PROTDLL))
    932935        {
    933           Runtime_Error(pszSrcFile, __LINE__,
    934                         GetPString(IDS_APPTYPEUNEXPECTEDTEXT),
    935                         pszPgm);
     936          Runtime_Error(pszSrcFile, __LINE__,
     937                        GetPString(IDS_APPTYPEUNEXPECTEDTEXT),
     938                        pszPgm);
    936939          DosFreeMem(pszPgm);
    937940          if (pszArgs)
     
    939942          return -1;
    940943        }
    941         apptype &= ~FAPPTYP_BOUND;
    942         if (apptype & (FAPPTYP_DOS | FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSPROT31))
     944        ulAppType &= ~FAPPTYP_BOUND;
     945        if (ulAppType & (FAPPTYP_DOS | FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSPROT31))
    943946        {
    944           if (apptype & (FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSPROT31))
     947          if (ulAppType & (FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSPROT31))
    945948          {
    946949            if (~type & FULLSCREEN &&
    947                 apptype & (FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSPROT31))
     950                ulAppType & (FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSPROT31))
    948951            {
    949952              ret = RunSeamless(pszPgm, pszArgs, hwnd);
     
    958961              strcat(pszPgm, pszArgs);
    959962              *pszArgs = 0;
    960               if (apptype & (FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT31))
     963              if (ulAppType & (FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT31))
    961964                strcat(pszArgs, "/3 ");
    962965              strcat(pszArgs, pszPgm);
     
    967970            if (~type & FULLSCREEN) {
    968971              type |= WINDOWED;
    969               apptype = SSF_TYPE_WINDOWEDVDM;
     972              ulAppType = SSF_TYPE_WINDOWEDVDM;
    970973            }
    971974            else {
    972975              type &= ~WINDOWED;
    973               apptype = SSF_TYPE_VDM;
    974             }
    975           }
    976         }
    977         else if (apptype & FAPPTYP_32BIT) {
    978           apptype &= ~FAPPTYP_32BIT;
    979           if (apptype == FAPPTYP_WINDOWAPI)
    980             apptype = SSF_TYPE_PM;
    981           else if (apptype == FAPPTYP_WINDOWCOMPAT)
    982             apptype = SSF_TYPE_WINDOWABLEVIO;
    983           else if (apptype == FAPPTYP_NOTWINDOWCOMPAT) {
    984             apptype = SSF_TYPE_FULLSCREEN;
     976              ulAppType = SSF_TYPE_VDM;
     977            }
     978          }
     979        }
     980        else if (ulAppType & FAPPTYP_32BIT) {
     981          ulAppType &= ~FAPPTYP_32BIT;
     982          if (ulAppType == FAPPTYP_WINDOWAPI)
     983            ulAppType = SSF_TYPE_PM;
     984          else if (ulAppType == FAPPTYP_WINDOWCOMPAT)
     985            ulAppType = SSF_TYPE_WINDOWABLEVIO;
     986          else if (ulAppType == FAPPTYP_NOTWINDOWCOMPAT) {
     987            ulAppType = SSF_TYPE_FULLSCREEN;
    985988            type &= ~WINDOWED;
    986989            type |= FULLSCREEN;
    987990          }
    988991          else                          /* ? */
    989             apptype = SSF_TYPE_WINDOWABLEVIO;
    990         }
    991         else if (apptype == FAPPTYP_WINDOWAPI)
    992           apptype = SSF_TYPE_PM;
    993         else if (apptype == FAPPTYP_WINDOWCOMPAT)
    994           apptype = SSF_TYPE_WINDOWABLEVIO;
    995         else if (apptype == FAPPTYP_NOTWINDOWCOMPAT) {
     992            ulAppType = SSF_TYPE_WINDOWABLEVIO;
     993        }
     994        else if (ulAppType == FAPPTYP_WINDOWAPI)
     995          ulAppType = SSF_TYPE_PM;
     996        else if (ulAppType == FAPPTYP_WINDOWCOMPAT)
     997          ulAppType = SSF_TYPE_WINDOWABLEVIO;
     998        else if (ulAppType == FAPPTYP_NOTWINDOWCOMPAT) {
    996999          type &= ~WINDOWED;
    997           apptype = SSF_TYPE_FULLSCREEN;
     1000          ulAppType = SSF_TYPE_FULLSCREEN;
    9981001        }
    9991002        else
    1000           apptype = SSF_TYPE_DEFAULT;
     1003          ulAppType = SSF_TYPE_DEFAULT;
    10011004        if ((type & FULLSCREEN || ~type & WINDOWED) &&
    1002             apptype == SSF_TYPE_WINDOWABLEVIO)
     1005            ulAppType == SSF_TYPE_WINDOWABLEVIO)
    10031006        {
    1004           apptype = SSF_TYPE_FULLSCREEN;
     1007          ulAppType = SSF_TYPE_FULLSCREEN;
    10051008        }
    10061009        // fixme parens?
    10071010        else if (type & FULLSCREEN ||
    1008                  (type & WINDOWED && apptype == SSF_TYPE_WINDOWEDVDM))
    1009           apptype = SSF_TYPE_VDM;
    1010       }
    1011       if (apptype == SSF_TYPE_WINDOWEDVDM && type & SEPARATEKEEP) {
     1011                 (type & WINDOWED && ulAppType == SSF_TYPE_WINDOWEDVDM))
     1012        {
     1013          ulAppType = SSF_TYPE_VDM;
     1014        }
     1015      }
     1016      if (ulAppType == SSF_TYPE_WINDOWEDVDM && type & SEPARATEKEEP) {
    10121017        type &= ~SEPARATEKEEP;
    10131018        type |= SEPARATE;
     
    10391044                Dos_Error(MB_ENTER,rc,HWND_DESKTOP,pszSrcFile,__LINE__,"DoCreateEventSem");
    10401045            }
    1041             // if (!rc)
    1042             //  fprintf(stderr,"runemf2 qcreated ptib %x hTermQ %x\n",ptib,hTermQ);
     1046            // if (!rc) fprintf(stderr,"%s %d qcreated ptib %x hTermQ %x\n",__FILE__, __LINE__,ptib,hTermQ);
    10431047          }
    10441048        } // if 1st time
     
    10471051          DosExitCritSec();
    10481052      } // if wait
     1053
     1054      memset(&sdata,0,sizeof(sdata));
    10491055      sdata.Length = sizeof(sdata);
    1050       sdata.Related = type & (WAIT | CHILD) ?
    1051                       SSF_RELATED_CHILD : SSF_RELATED_INDEPENDENT;
     1056      sdata.Related = type & (WAIT | CHILD) ? SSF_RELATED_CHILD :
     1057                                              SSF_RELATED_INDEPENDENT;
    10521058      sdata.FgBg = type & BACKGROUND ? SSF_FGBG_BACK : SSF_FGBG_FORE;
    10531059      sdata.TraceOpt = SSF_TRACEOPT_NONE;
    1054       sdata.PgmTitle = NULL;
    10551060      sdata.PgmName = pszPgm;
    1056       sdata.PgmInputs = *pszArgs ? pszArgs : NULL;
    1057       sdata.TermQ = useTermQ ? szTermQName : NULL;
     1061      if (*pszArgs)
     1062        sdata.PgmInputs = pszArgs;
     1063      if (useTermQ)
     1064        sdata.TermQ = szTermQName;
    10581065      sdata.Environment = pszEnvironment;
    10591066      sdata.InheritOpt = SSF_INHERTOPT_PARENT;
    1060       sdata.SessionType = (USHORT)apptype;
     1067      sdata.SessionType = ulAppType;
    10611068      sdata.ObjectBuffer = szObject;
    10621069      sdata.ObjectBuffLen = sizeof(szObject);
    1063       sdata.IconFile = NULL;
    1064       sdata.PgmHandle = 0L;
    1065       sdata.Reserved = 0;
    1066       sdata.PgmControl = (USHORT) ((SSF_CONTROL_NOAUTOCLOSE * ((type & 15) == SEPARATEKEEP)) |
    1067                         (SSF_CONTROL_MAXIMIZE * ((type & MAXIMIZED) != 0)) |
    1068                         (SSF_CONTROL_MINIMIZE * ((type & MINIMIZED) != 0)) |
    1069                        (SSF_CONTROL_INVISIBLE * ((type & INVISIBLE) != 0)));
     1070      if ((type & 15) == SEPARATEKEEP)
     1071        sdata.PgmControl |= SSF_CONTROL_NOAUTOCLOSE;
     1072      if (type & MAXIMIZED)
     1073        sdata.PgmControl |= SSF_CONTROL_MAXIMIZE;
     1074      if (type & MINIMIZED)
     1075        sdata.PgmControl |= SSF_CONTROL_MINIMIZE;
     1076      if (type & INVISIBLE)
     1077        sdata.PgmControl |= SSF_CONTROL_INVISIBLE;
     1078
    10701079      if (pszDirectory && *pszDirectory) {
    10711080        save_dir2(szSavedir);
    10721081        switch_to(pszDirectory);
    10731082      }
     1083
     1084     // printf("%s %d DosStartsession thread 0x%x data\n ",
     1085      //       __FILE__, __LINE__,ptib->tib_ordinal); fflush(stdout);   // 10 Mar 07 SHL hang
     1086     // printf(" %d %d %d %s %s %s %d %d\n %s %x %x\n",
     1087      //       sdata.Length , sdata.Related, sdata.FgBg, sdata.PgmName,
     1088        //     sdata.PgmInputs, sdata.TermQ, sdata.InheritOpt,
     1089          //   sdata.SessionType, szTermQName,
     1090       //   hTermQ, hTermQSem); fflush(stdout);
    10741091      ret = DosStartSession(&sdata, &ulSessID, &sessPID);
     1092      if (type & WAIT) {
     1093       // printf("%s %d DosStartession thread 0x%x rc = %d sess = %u pid = 0x%x\n",
     1094       //        __FILE__, __LINE__, ptib->tib_ordinal,ret, ulSessID, sessPID); fflush(stdout); // 10 Mar 07 SHL hang
     1095      }
     1096      else {
     1097       // printf("%s %d DosStartession thread 0x%x nowait rc = %d\n",
     1098         //      __FILE__, __LINE__, ptib->tib_ordinal,ret); fflush(stdout);    // 10 Mar 07 SHL hang
     1099      }
     1100
    10751101      if (pszDirectory && *pszDirectory)
    10761102        switch_to(szSavedir);
     1103
    10771104      if (ret && ret != ERROR_SMG_START_IN_BACKGROUND) {
    10781105        Dos_Error(MB_CANCEL,ret,hwnd,pszSrcFile,__LINE__,
     
    10841111
    10851112        if (!useTermQ) {
     1113          STATUSDATA sd;
    10861114          // Could not create queue - fallback - fixme to be gone?
    1087           STATUSDATA sd;
     1115         // printf("%s %d waiting wo/termq\n", __FILE__, __LINE__); fflush(stdout);     // 12 Mar 07 SHL hang
    10881116
    10891117          memset(&sd, 0, sizeof(sd));
     
    10971125              break;
    10981126            if (ctr > 10) {
     1127           //   printf("%s %d thread 0x%x showing slow sess %u pid 0x%x\n",
     1128             //        __FILE__, __LINE__,ptib->tib_ordinal,ulSessID,sessPID); fflush(stdout);  // 12 Mar 07 SHL
    10991129              ShowSession(hwnd, sessPID);       // Show every 2 seconds
    11001130              ctr = 0;
     
    11141144            }
    11151145            else {
    1116               // fixme to not do this?
    1117               if (ctr == 20)
     1146              if (ctr == 20) {
     1147               // printf("%s %d thread 0x%x showing slow sess %u pid 0x%x\n",
     1148                //       __FILE__, __LINE__,ptib->tib_ordinal,ulSessID,sessPID); fflush(stdout);
    11181149                ShowSession(hwnd, sessPID);             // Show long running session
     1150              }
     1151             // printf("%s %d thread 0x%x waiting for slow sess %u pid 0x%x\n",
     1152               //      __FILE__, __LINE__,ptib->tib_ordinal,ulSessID, sessPID); fflush(stdout);
    11191153              rc = DosReadQueue(hTermQ, &rq, &ulLength, (PPVOID)&pTermInfo, 0,
    11201154                                DCWW_WAIT, &bPriority, 0);
     
    11281162            }
    11291163
     1164          //  printf("%s %d DosReadQueue thread 0x%x sess %u sessRC %u rq.pid 0x%x rq.data 0x%x\n",
     1165            //       __FILE__, __LINE__,ptib->tib_ordinal,pTermInfo->usSessID,pTermInfo->usRC,rq.pid, rq.ulData); fflush(stdout);
     1166
     1167            // might be looping here if confused about session id - fixme to ensure not possible?
    11301168            if (pTermInfo->usSessID == ulSessID)
    11311169              break;                    // Our session is done
    11321170
    1133             // Requeue for other thread
     1171            // Requeue session for other thread
    11341172            {
    11351173              static ULONG ulLastSessID;
    1136               // fprintf(stderr,"runemf2 requeue other ptib %x sessId %x ti.sessId %x ti.rc %d\n",ptib,ulSessID,pTermInfo->usSessID,pTermInfo->usRC);
    1137               // fixme to be gone
     1174             // printf("%s %d requeue thread 0x%x our sess %u term sess %u term rc %u\n",
     1175              //       __FILE__, __LINE__,ptib->tib_ordinal,ulSessID,pTermInfo->usSessID,pTermInfo->usRC); fflush(stdout);
     1176              // fixme to be gone when no longer needed for debug?
    11381177              if (ulLastSessID) {
    11391178                DosSleep(500);
    11401179                ulLastSessID = pTermInfo->usSessID;
    11411180              }
    1142               // requeue and do not free yet
     1181              // requeue term report for other thread and do not free yet
    11431182              rc = DosWriteQueue(hTermQ, rq.ulData, ulLength,(PVOID)pTermInfo, bPriority);
    11441183              if (rc)
     
    11481187          } // for
    11491188
    1150           ret = !(!pTermInfo->usRC);            // Set TRUE if rc 0
    1151           // fprintf(stderr,"runemf2 term this ptib %x sessID %x rq.pid %x rq.data %x ti.rc %d\n",ptib,ulSessID,rq.pid,rq.ulData,pTermInfo->usRC);
    1152           // fflush(stderr);
     1189          ret = pTermInfo->usRC == 0;           // Set 1 if rc 0 else 0
     1190         // printf("%s %d thread 0x%x term for sess %u\n",
     1191           //      __FILE__, __LINE__,ptib->tib_ordinal,ulSessID);fflush(stdout);
    11531192          DosFreeMem(pTermInfo);
    11541193        }
     
    11651204  if (pszArgs)
    11661205    DosFreeMem(pszArgs);
     1206
    11671207  return ret;
    11681208}
     
    12531293        pgd.pszEnvironment = env;
    12541294        pgd.pszStartupDir = startdir;
    1255         pgd.pszParameters = (*parameters) ? parameters : NULL;
     1295        pgd.pszParameters = *parameters ? parameters : NULL;
    12561296        pgd.pszExecutable = executable;
    12571297        pgd.swpInitial.hwndInsertBehind = HWND_TOP;
Note: See TracChangeset for help on using the changeset viewer.