Changeset 562 for trunk/dll/systemf.c
- Timestamp:
- Mar 15, 2007, 1:13:12 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/dll/systemf.c
r552 r562 623 623 STARTDATA sdata; 624 624 REQUESTDATA rq; 625 ULONG ulSessID, apptype, ulLength, ctr; 625 ULONG ulSessID; 626 ULONG ulLength; 627 UINT ctr; 628 ULONG ulAppType; 626 629 PID sessPID; 627 630 BOOL wasquote; … … 776 779 switch_to(pszDirectory); 777 780 } 778 rc = DosQ AppType(pszPgm,&apptype);781 rc = DosQueryAppType(pszPgm,&ulAppType); 779 782 if (!strchr(pszPgm, '\\') && 780 783 !strchr(pszPgm, ':') && … … 783 786 switch_to(szSavedir); 784 787 if (rc) { 785 786 787 788 Dos_Error(MB_CANCEL,rc,hwnd,pszSrcFile,__LINE__, 789 GetPString(IDS_DOSQAPPTYPEFAILEDTEXT), 790 pszPgm); 788 791 DosFreeMem(pszPgm); 789 792 if (pszArgs) … … 791 794 return -1; 792 795 } 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) 796 799 { 797 798 799 apptype, pszPgm);800 Runtime_Error(pszSrcFile, __LINE__, 801 GetPString(IDS_APPTYPEUNEXPECTEDTEXT), 802 ulAppType, pszPgm); 800 803 if (pszPgm) 801 804 DosFreeMem(pszPgm); … … 804 807 return -1; 805 808 } 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) 808 811 { 809 810 811 apptype, pszPgm);812 Runtime_Error(pszSrcFile, __LINE__, 813 GetPString(IDS_APPTYPEUNEXPECTEDTEXT), 814 ulAppType, pszPgm); 812 815 if (pszPgm) 813 816 DosFreeMem(pszPgm); … … 912 915 switch_to(pszDirectory); 913 916 } 914 rc = DosQ AppType(pszPgm,&apptype);917 rc = DosQueryAppType(pszPgm,&ulAppType); 915 918 if (!strchr(pszPgm, '\\') && 916 919 !strchr(pszPgm, ':') && … … 919 922 switch_to(szSavedir); 920 923 if (rc) { 921 922 923 924 Dos_Error(MB_CANCEL,rc,hwnd,pszSrcFile,__LINE__, 925 GetPString(IDS_DOSQAPPTYPEFAILEDTEXT), 926 pszPgm); 924 927 DosFreeMem(pszPgm); 925 928 if (pszArgs) … … 928 931 } 929 932 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)) 932 935 { 933 934 935 936 Runtime_Error(pszSrcFile, __LINE__, 937 GetPString(IDS_APPTYPEUNEXPECTEDTEXT), 938 pszPgm); 936 939 DosFreeMem(pszPgm); 937 940 if (pszArgs) … … 939 942 return -1; 940 943 } 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)) 943 946 { 944 if ( apptype & (FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSPROT31))947 if (ulAppType & (FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSPROT31)) 945 948 { 946 949 if (~type & FULLSCREEN && 947 apptype & (FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSPROT31))950 ulAppType & (FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSPROT31)) 948 951 { 949 952 ret = RunSeamless(pszPgm, pszArgs, hwnd); … … 958 961 strcat(pszPgm, pszArgs); 959 962 *pszArgs = 0; 960 if ( apptype & (FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT31))963 if (ulAppType & (FAPPTYP_WINDOWSPROT | FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT31)) 961 964 strcat(pszArgs, "/3 "); 962 965 strcat(pszArgs, pszPgm); … … 967 970 if (~type & FULLSCREEN) { 968 971 type |= WINDOWED; 969 apptype = SSF_TYPE_WINDOWEDVDM;972 ulAppType = SSF_TYPE_WINDOWEDVDM; 970 973 } 971 974 else { 972 975 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; 985 988 type &= ~WINDOWED; 986 989 type |= FULLSCREEN; 987 990 } 988 991 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) { 996 999 type &= ~WINDOWED; 997 apptype = SSF_TYPE_FULLSCREEN;1000 ulAppType = SSF_TYPE_FULLSCREEN; 998 1001 } 999 1002 else 1000 apptype = SSF_TYPE_DEFAULT;1003 ulAppType = SSF_TYPE_DEFAULT; 1001 1004 if ((type & FULLSCREEN || ~type & WINDOWED) && 1002 apptype == SSF_TYPE_WINDOWABLEVIO)1005 ulAppType == SSF_TYPE_WINDOWABLEVIO) 1003 1006 { 1004 apptype = SSF_TYPE_FULLSCREEN;1007 ulAppType = SSF_TYPE_FULLSCREEN; 1005 1008 } 1006 1009 // fixme parens? 1007 1010 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) { 1012 1017 type &= ~SEPARATEKEEP; 1013 1018 type |= SEPARATE; … … 1039 1044 Dos_Error(MB_ENTER,rc,HWND_DESKTOP,pszSrcFile,__LINE__,"DoCreateEventSem"); 1040 1045 } 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); 1043 1047 } 1044 1048 } // if 1st time … … 1047 1051 DosExitCritSec(); 1048 1052 } // if wait 1053 1054 memset(&sdata,0,sizeof(sdata)); 1049 1055 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; 1052 1058 sdata.FgBg = type & BACKGROUND ? SSF_FGBG_BACK : SSF_FGBG_FORE; 1053 1059 sdata.TraceOpt = SSF_TRACEOPT_NONE; 1054 sdata.PgmTitle = NULL;1055 1060 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; 1058 1065 sdata.Environment = pszEnvironment; 1059 1066 sdata.InheritOpt = SSF_INHERTOPT_PARENT; 1060 sdata.SessionType = (USHORT)apptype;1067 sdata.SessionType = ulAppType; 1061 1068 sdata.ObjectBuffer = szObject; 1062 1069 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 1070 1079 if (pszDirectory && *pszDirectory) { 1071 1080 save_dir2(szSavedir); 1072 1081 switch_to(pszDirectory); 1073 1082 } 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); 1074 1091 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 1075 1101 if (pszDirectory && *pszDirectory) 1076 1102 switch_to(szSavedir); 1103 1077 1104 if (ret && ret != ERROR_SMG_START_IN_BACKGROUND) { 1078 1105 Dos_Error(MB_CANCEL,ret,hwnd,pszSrcFile,__LINE__, … … 1084 1111 1085 1112 if (!useTermQ) { 1113 STATUSDATA sd; 1086 1114 // 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 1088 1116 1089 1117 memset(&sd, 0, sizeof(sd)); … … 1097 1125 break; 1098 1126 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 1099 1129 ShowSession(hwnd, sessPID); // Show every 2 seconds 1100 1130 ctr = 0; … … 1114 1144 } 1115 1145 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); 1118 1149 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); 1119 1153 rc = DosReadQueue(hTermQ, &rq, &ulLength, (PPVOID)&pTermInfo, 0, 1120 1154 DCWW_WAIT, &bPriority, 0); … … 1128 1162 } 1129 1163 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? 1130 1168 if (pTermInfo->usSessID == ulSessID) 1131 1169 break; // Our session is done 1132 1170 1133 // Requeue for other thread1171 // Requeue session for other thread 1134 1172 { 1135 1173 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? 1138 1177 if (ulLastSessID) { 1139 1178 DosSleep(500); 1140 1179 ulLastSessID = pTermInfo->usSessID; 1141 1180 } 1142 // requeue and do not free yet1181 // requeue term report for other thread and do not free yet 1143 1182 rc = DosWriteQueue(hTermQ, rq.ulData, ulLength,(PVOID)pTermInfo, bPriority); 1144 1183 if (rc) … … 1148 1187 } // for 1149 1188 1150 ret = !(!pTermInfo->usRC); // Set TRUE if rc01151 // 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); 1153 1192 DosFreeMem(pTermInfo); 1154 1193 } … … 1165 1204 if (pszArgs) 1166 1205 DosFreeMem(pszArgs); 1206 1167 1207 return ret; 1168 1208 } … … 1253 1293 pgd.pszEnvironment = env; 1254 1294 pgd.pszStartupDir = startdir; 1255 pgd.pszParameters = (*parameters)? parameters : NULL;1295 pgd.pszParameters = *parameters ? parameters : NULL; 1256 1296 pgd.pszExecutable = executable; 1257 1297 pgd.swpInitial.hwndInsertBehind = HWND_TOP;
Note:
See TracChangeset
for help on using the changeset viewer.