| | 964 | | trc_store_trace_event( ID, TD, tid, omit ) |
| | 965 | | TRC_ID ID; |
| | 966 | | TRC_TEVDESC TD; |
| | 967 | | int tid; |
| | 968 | | int omit; |
| | 969 | | { |
| | 970 | | TRC_DATADESC DD; |
| | 971 | | |
| | 972 | | TRC_TEVTASK TT; |
| | 973 | | |
| | 974 | | char upk_byte[TRC_MAX_UNPACK_ARR_SIZE];
|
| | | | ... |
| | 989 | | int maxlen; |
| | 990 | | int ignore; |
| | 991 | | int tusec; |
| | 992 | | int tsec; |
| | 993 | | int len; |
| | 994 | | int num; |
| | 995 | | int i; |
| | 996 | | |
| | 997 | | |
| | 998 | | |
| | 999 | | if ( !omit && TD->dump ) |
| | 1000 | | trc_dump_tevdesc( ID, TD, tid ); |
| | 1001 | | |
| | 1002 | | |
| | 1003 | | |
| | 1004 | | TT = (TRC_TEVTASK) NULL;
|
| | 1005 | | |
| | 1006 | | tsec = tusec = -1; |
| | 1007 | | |
| | 1008 | | newtask = TRC_FALSE;
|
| | 1009 | | endtask = TRC_FALSE;
|
| | 1010 | | |
| | 1011 | | if ( !strcmp( TD->name, "newtask" ) |
| | 1012 | | || !strcmp( TD->name, "spntask" ) ) |
| | 1013 | | { |
| | 1014 | | newtask = TRC_TRUE;
|
| | 1015 | | } |
| | 1016 | | |
| | 1017 | | else if ( !strcmp( TD->name, "endtask" ) ) |
| | 1018 | | endtask = TRC_TRUE;
|
| | 1019 | | |
| | 1020 | | ignore = TRC_FALSE;
|
| | 1021 | | |
| | 1022 | | |
| | 1023 | | |
| | 1024 | | if ( !omit ) |
| | 1025 | | ( ID, TD, tid ); |
| | 1026 | | |
| | 1027 | | |
| | 1028 | | |
| | 1029 | | DD = TD->ddesc; |
| | 1030 | | |
| | 1031 | | while ( DD != NULL )
|
| | 1032 | | { |
| | 1033 | | if ( DD->array == TEV_DATA_ARRAY )
|
| | 1034 | | { |
| | 1035 | | TRC_PVMCKERR( pvm_upkint( &num, 1, 1 ),
|
| | 1036 | | "Array Unpack", return( TRC_FALSE ) ); |
| | 1037 | | |
| | 1038 | | if ( num > TRC_MAX_UNPACK_ARR_SIZE
|
| | 1039 | | && DD->dt != TEV_DATA_STRING )
|
| | 1040 | | { |
| | 1041 | | if ( !omit ) |
| | 1042 | | printf( "Error: Unpack Size %d Too Large\n", num ); |
| | 1043 | | |
| | 1044 | | return( TRC_FALSE );
|
| | 1045 | | } |
| | 1046 | | |
| | 1047 | | if ( !omit ) |
| | 1048 | | { |
| | 1049 | | if ( DD->dt == TEV_DATA_CPLX
|
| | 1050 | | || DD->dt == TEV_DATA_DCPLX )
|
| | 1051 | | { |
| | 1052 | | fprintf( ID->trace_out, "[%d] { ", num * 2 ); |
| | 1053 | | |
| | 1054 | | } |
| | 1055 | | |
| | 1056 | | else if ( DD->dt == TEV_DATA_STRING )
|
| | 1057 | | fprintf( ID->trace_out, "[%d] ", num ); |
| | 1058 | | |
| | 1059 | | else if ( DD->dt == TEV_DATA_BYTE )
|
| | 1060 | | { |
| | 1061 | | fprintf( ID->trace_out, "[%d] { ", num + 1 ); |
| | 1062 | | |
| | 1063 | | } |
| | 1064 | | |
| | 1065 | | else |
| | 1066 | | { |
| | 1067 | | fprintf( ID->trace_out, "[%d] { ", num ); |
| | 1068 | | |
| | 1069 | | } |
| | 1070 | | } |
| | 1071 | | } |
| | 1072 | | |
| | 1073 | | else |
| | 1074 | | num = 1; |
| | 1075 | | |
| | 1076 | | switch ( DD->dt ) |
| | 1077 | | { |
| | 1078 | | case TEV_DATA_NULL: break;
|
| | 1079 | | |
| | 1080 | | case TEV_DATA_BYTE:
|
| | 1081 | | { |
| | 1082 | | TRC_PVMCKERR( pvm_upkbyte( upk_byte, num, 1 ),
|
| | 1083 | | "Event BYTE Unpack", return( TRC_FALSE ) ); |
| | 1084 | | |
| | 1085 | | if ( omit ) |
| | 1086 | | break; |
| | 1087 | | |
| | 1088 | | if ( DD->array == TEV_DATA_ARRAY )
|
| | 1089 | | fprintf( ID->trace_out, "\"" ); |
| | 1090 | | |
| | 1091 | | for ( i=0 ; i < num ; i++ ) |
| | 1092 | | fprintf( ID->trace_out, "%c", upk_byte[i] ); |
| | 1093 | | |
| | 1094 | | if ( DD->array == TEV_DATA_ARRAY )
|
| | 1095 | | fprintf( ID->trace_out, "\"" ); |
| | 1096 | | |
| | 1097 | | break; |
| | 1098 | | } |
| | 1099 | | |
| | 1100 | | case TEV_DATA_CPLX:
|
| | 1101 | | { |
| | 1102 | | TRC_PVMCKERR( pvm_upkfloat( upk_float, num * 2, 1 ),
|
| | 1103 | | "Event CPLX Unpack", return( TRC_FALSE ) ); |
| | 1104 | | |
| | 1105 | | if ( omit ) |
| | 1106 | | break; |
| | 1107 | | |
| | 1108 | | for ( i=0 ; i < num ; i++ ) |
| | 1109 | | { |
| | 1110 | | fprintf( ID->trace_out, "%f, %f", |
| | 1111 | | upk_float[ 2 * i ], |
| | 1112 | | upk_float[ (2 * i) + 1 ] ); |
| | 1113 | | |
| | 1114 | | if ( i < num - 1 ) |
| | 1115 | | fprintf( ID->trace_out, ", " ); |
| | 1116 | | } |
| | 1117 | | |
| | 1118 | | break; |
| | 1119 | | } |
| | 1120 | | |
| | 1121 | | case TEV_DATA_DCPLX:
|
| | 1122 | | { |
| | 1123 | | TRC_PVMCKERR( pvm_upkdouble( upk_double, num * 2, 1 ),
|
| | 1124 | | "Event DCPLX Unpack", return( TRC_FALSE ) ); |
| | 1125 | | |
| | 1126 | | if ( omit ) |
| | 1127 | | break; |
| | 1128 | | |
| | 1129 | | for ( i=0 ; i < num ; i++ ) |
| | 1130 | | { |
| | 1131 | | fprintf( ID->trace_out, "%lf, %lf", |
| | 1132 | | upk_double[ 2 * i ], |
| | 1133 | | upk_double[ (2 * i) + 1 ] ); |
| | 1134 | | |
| | 1135 | | if ( i < num - 1 ) |
| | 1136 | | fprintf( ID->trace_out, ", " ); |
| | 1137 | | } |
| | 1138 | | |
| | 1139 | | break; |
| | 1140 | | } |
| | 1141 | | |
| | 1142 | | case TEV_DATA_DOUBLE:
|
| | 1143 | | { |
| | 1144 | | TRC_PVMCKERR( pvm_upkdouble( upk_double, num, 1 ),
|
| | 1145 | | "Event DOUBLE Unpack", return( TRC_FALSE ) ); |
| | 1146 | | |
| | 1147 | | if ( omit ) |
| | 1148 | | break; |
| | 1149 | | |
| | 1150 | | for ( i=0 ; i < num ; i++ ) |
| | 1151 | | { |
| | 1152 | | fprintf( ID->trace_out, "%lf", upk_double[i] ); |
| | 1153 | | |
| | 1154 | | if ( i < num - 1 ) |
| | 1155 | | fprintf( ID->trace_out, ", " ); |
| | 1156 | | } |
| | 1157 | | |
| | 1158 | | break; |
| | 1159 | | } |
| | 1160 | | |
| | 1161 | | case TEV_DATA_FLOAT:
|
| | 1162 | | { |
| | 1163 | | TRC_PVMCKERR( pvm_upkfloat( upk_float, num, 1 ),
|
| | 1164 | | "Event FLOAT Unpack", return( TRC_FALSE ) ); |
| | 1165 | | |
| | 1166 | | if ( omit ) |
| | 1167 | | break; |
| | 1168 | | |
| | 1169 | | for ( i=0 ; i < num ; i++ ) |
| | 1170 | | { |
| | 1171 | | fprintf( ID->trace_out, "%f", upk_float[i] ); |
| | 1172 | | |
| | 1173 | | if ( i < num - 1 ) |
| | 1174 | | fprintf( ID->trace_out, ", " ); |
| | 1175 | | } |
| | 1176 | | |
| | 1177 | | break; |
| | 1178 | | } |
| | 1179 | | |
| | 1180 | | case TEV_DATA_INT:
|
| | 1181 | | { |
| | 1182 | | TRC_PVMCKERR( pvm_upkint( upk_int, num, 1 ),
|
| | 1183 | | "Event INT Unpack", return( TRC_FALSE ) ); |
| | 1184 | | |
| | 1185 | | if ( !omit ) |
| | 1186 | | { |
| | 1187 | | for ( i=0 ; i < num ; i++ ) |
| | 1188 | | { |
| | 1189 | | fprintf( ID->trace_out, "%d", upk_int[i] ); |
| | 1190 | | |
| | 1191 | | if ( i < num - 1 ) |
| | 1192 | | fprintf( ID->trace_out, ", " ); |
| | 1193 | | } |
| | 1194 | | } |
| | 1195 | | |
| | 1196 | | if ( ( newtask || endtask ) |
| | 1197 | | && !strcmp( DD->did->name, "TID" ) ) |
| | 1198 | | { |
| | 1199 | | if ( !omit && newtask ) |
| | 1200 | | { |
| | 1201 | | TT = trc_get_tevtask_tid( ID, upk_int[0] ); |
| | 1202 | | |
| | 1203 | | if ( TT == NULL )
|
| | 1204 | | { |
| | 1205 | | if ( !ignore ) |
| | 1206 | | { |
| | 1207 | | sprintf( msg, |
| | 1208 | | "Task TID=0x%x Connected to %s", |
| | 1209 | | upk_int[0], TRC_NAME ); |
| | 1210 | | |
| | 1211 | | trc_status_msg( ID, msg ); |
| | 1212 | | } |
| | 1213 | | |
| | 1214 | | TT = trc_create_tevtask(); |
| | 1215 | | |
| | 1216 | | TT->tid = upk_int[0]; |
| | 1217 | | |
| | 1218 | | TT->outstatus = TRC_TASK_NOOUT;
|
| | 1219 | | |
| | 1220 | | TT->next = ID->tevtask_list; |
| | 1221 | | |
| | 1222 | | ID->tevtask_list = TT; |
| | 1223 | | } |
| | 1224 | | |
| | 1225 | | if ( !ignore ) |
| | 1226 | | TT->tevstatus = TRC_TASK_ALIVE;
|
| | 1227 | | |
| | 1228 | | else |
| | 1229 | | TT->tevstatus = TRC_TASK_IGNORE;
|
| | 1230 | | } |
| | 1231 | | |
| | 1232 | | if ( endtask ) |
| | 1233 | | { |
| | 1234 | | TT = trc_get_tevtask_tid( ID, upk_int[0] ); |
| | 1235 | | |
| | 1236 | | if ( TT != NULL )
|
| | 1237 | | { |
| | 1238 | | if ( TT->tevstatus == TRC_TASK_ALIVE )
|
| | 1239 | | { |
| | 1240 | | TT->tevstatus = TRC_TASK_DEAD;
|
| | 1241 | | |
| | 1242 | | trc_check_for_dead_host( ID, TT ); |
| | 1243 | | |
| | 1244 | | if ( !trc_tevtasks_alive( ID ) ) |
| | 1245 | | trc_end_trace( ID ); |
| | 1246 | | } |
| | 1247 | | |
| | 1248 | | else |
| | 1249 | | TT->tevstatus = TRC_TASK_DEAD;
|
| | 1250 | | } |
| | 1251 | | |
| | 1252 | | else if ( !omit ) |
| | 1253 | | { |
| | 1254 | | printf( "\nWarning: ENDTASK Unknown Task TID=0x%x.\n\n", |
| | 1255 | | upk_int[0] ); |
| | 1256 | | } |
| | 1257 | | } |
| | 1258 | | } |
| | 1259 | | |
| | 1260 | | else if ( !strcmp( DD->did->name, "TS" ) ) |
| | 1261 | | tsec = upk_int[0]; |
| | 1262 | | |
| | 1263 | | else if ( !strcmp( DD->did->name, "TU" ) ) |
| | 1264 | | tusec = upk_int[0]; |
| | 1265 | | |
| | 1266 | | break; |
| | 1267 | | } |
| | 1268 | | |
| | 1269 | | case TEV_DATA_UINT:
|
| | 1270 | | { |
| | 1271 | | TRC_PVMCKERR( pvm_upkint( upk_int, num, 1 ),
|
| | 1272 | | "Event UINT Unpack", return( TRC_FALSE ) ); |
| | 1273 | | |
| | 1274 | | if ( omit ) |
| | 1275 | | break; |
| | 1276 | | |
| | 1277 | | for ( i=0 ; i < num ; i++ ) |
| | 1278 | | { |
| | 1279 | | fprintf( ID->trace_out, "%u", |
| | 1280 | | (unsigned) upk_int[i] ); |
| | 1281 | | |
| | 1282 | | if ( i < num - 1 ) |
| | 1283 | | fprintf( ID->trace_out, ", " ); |
| | 1284 | | } |
| | 1285 | | |
| | 1286 | | break; |
| | 1287 | | } |
| | 1288 | | |
| | 1289 | | case TEV_DATA_LONG:
|
| | 1290 | | { |
| | 1291 | | TRC_PVMCKERR( pvm_upklong( upk_long, num, 1 ),
|
| | 1292 | | "Event LONG Unpack", return( TRC_FALSE ) ); |
| | 1293 | | |
| | 1294 | | if ( omit ) |
| | 1295 | | break; |
| | 1296 | | |
| | 1297 | | for ( i=0 ; i < num ; i++ ) |
| | 1298 | | { |
| | 1299 | | fprintf( ID->trace_out, "%ld", upk_long[i] ); |
| | 1300 | | |
| | 1301 | | if ( i < num - 1 ) |
| | 1302 | | fprintf( ID->trace_out, ", " ); |
| | 1303 | | } |
| | 1304 | | |
| | 1305 | | break; |
| | 1306 | | } |
| | 1307 | | |
| | 1308 | | case TEV_DATA_ULONG:
|
| | 1309 | | { |
| | 1310 | | TRC_PVMCKERR( pvm_upklong( upk_long, num, 1 ),
|
| | 1311 | | "Event ULONG Unpack", return( TRC_FALSE ) ); |
| | 1312 | | |
| | 1313 | | if ( omit ) |
| | 1314 | | break; |
| | 1315 | | |
| | 1316 | | for ( i=0 ; i < num ; i++ ) |
| | 1317 | | { |
| | 1318 | | fprintf( ID->trace_out, "%ld", upk_long[i] ); |
| | 1319 | | |
| | 1320 | | if ( i < num - 1 ) |
| | 1321 | | fprintf( ID->trace_out, ", " ); |
| | 1322 | | } |
| | 1323 | | |
| | 1324 | | break; |
| | 1325 | | } |
| | 1326 | | |
| | 1327 | | case TEV_DATA_SHORT:
|
| | 1328 | | { |
| | 1329 | | TRC_PVMCKERR( pvm_upkshort( upk_short, num, 1 ),
|
| | 1330 | | "Event SHORT Unpack", return( TRC_FALSE ) ); |
| | 1331 | | |
| | 1332 | | if ( omit ) |
| | 1333 | | break; |
| | 1334 | | |
| | 1335 | | for ( i=0 ; i < num ; i++ ) |
| | 1336 | | { |
| | 1337 | | fprintf( ID->trace_out, "%d", upk_short[i] ); |
| | 1338 | | |
| | 1339 | | if ( i < num - 1 ) |
| | 1340 | | fprintf( ID->trace_out, ", " ); |
| | 1341 | | } |
| | 1342 | | |
| | 1343 | | break; |
| | 1344 | | } |
| | 1345 | | |
| | 1346 | | case TEV_DATA_USHORT:
|
| | 1347 | | { |
| | 1348 | | TRC_PVMCKERR( pvm_upkshort( upk_short, num, 1 ),
|
| | 1349 | | "Event USHORT Unpack", return( TRC_FALSE ) ); |
| | 1350 | | |
| | 1351 | | if ( omit ) |
| | 1352 | | break; |
| | 1353 | | |
| | 1354 | | for ( i=0 ; i < num ; i++ ) |
| | 1355 | | { |
| | 1356 | | fprintf( ID->trace_out, "%u", upk_short[i] ); |
| | 1357 | | |
| | 1358 | | if ( i < num - 1 ) |
| | 1359 | | fprintf( ID->trace_out, ", " ); |
| | 1360 | | } |
| | 1361 | | |
| | 1362 | | break; |
| | 1363 | | } |
| | 1364 | | |
| | 1365 | | case TEV_DATA_STRING:
|
| | 1366 | | { |
| | 1367 | | if ( num < 1 ) |
| | 1368 | | break; |
| | 1369 | | |
| | 1370 | | strarr = (char **) malloc( (unsigned) num |
| true | 1371 | | * sizeof(char *) ); |
| | 1372 | | trc_memcheck( strarr, "String Array" ); |
| | 1373 | | |
| | 1374 | | maxlen = 0; |
| | 1375 | | |
| | 1376 | | for ( i=0 ; i < num ; i++ ) |
| | 1377 | | { |
| | 1378 | | TRC_PVMCKERR( pvm_upkstr( upk_str ),
|
| | 1379 | | "Event STRING Unpack", return( TRC_FALSE ) ); |
| | 1380 | | |
| | 1381 | | if ( (len = strlen( upk_str )) > maxlen ) |
| | 1382 | | maxlen = len; |
| | 1383 | | |
| | 1384 | | strarr[i] = trc_copy_str( upk_str ); |
| | 1385 | | } |
| | 1386 | | |
| | 1387 | | if ( !omit && newtask |
| | 1388 | | && !strcmp( DD->did->name, "TN" ) ) |
| | 1389 | | { |
| | 1390 | | if ( !(ID->group_tasks) |
| | 1391 | | && TRC_GROUPTASK( upk_str ) )
|
| | 1392 | | { |
| | 1393 | | ignore = TRC_TRUE;
|
| | 1394 | | |
| | 1395 | | if ( TT != NULL )
|
| | 1396 | | { |
| | 1397 | | sprintf( msg, |
| | 1398 | | "Ignoring Task \"%s\"", upk_str ); |
| | 1399 | | |
| | 1400 | | trc_status_msg( ID, msg ); |
| | 1401 | | |
| | 1402 | | TT->tevstatus = TRC_TASK_IGNORE;
|
| | 1403 | | } |
| | 1404 | | } |
| | 1405 | | } |
| | 1406 | | |
| | 1407 | | if ( !omit ) |
| | 1408 | | { |
| | 1409 | | fprintf( ID->trace_out, "[%d] { ", maxlen + 1 ); |
| | 1410 | | |
| | 1411 | | for ( i=0 ; i < num ; i++ ) |
| | 1412 | | { |
| | 1413 | | fprintf( ID->trace_out, "\"%s\"", strarr[i] ); |
| | 1414 | | |
| | 1415 | | if ( i < num - 1 ) |
| | 1416 | | fprintf( ID->trace_out, ", " ); |
| | 1417 | | |
| | 1418 | | free( strarr[i] ); |
| | 1419 | | } |
| | 1420 | | |
| | 1421 | | if ( DD->array == TEV_DATA_SCALAR )
|
| | 1422 | | fprintf( ID->trace_out, " }" ); |
| | 1423 | | } |
| | 1424 | | |
| | 1425 | | else |
| | 1426 | | { |
| | 1427 | | for ( i=0 ; i < num ; i++ ) |
| | 1428 | | free( strarr[i] ); |
| | 1429 | | } |
| | 1430 | | |
| | 1431 | | free( strarr ); |
| | 1432 | | |
| | 1433 | | break; |
| | 1434 | | } |
| | 1435 | | |
| | 1436 | | case TEV_DATA_STRUCT_START:
|
| | 1437 | | case TEV_DATA_STRUCT_END:
|
| | 1438 | | case TEV_DATA_DEFERRED:
|
| | 1439 | | { |
| | 1440 | | if ( !omit ) |
| | 1441 | | printf( "DT Not Impl\n" ); |
| | 1442 | | |
| | 1443 | | break; |
| | 1444 | | } |
| | 1445 | | |
| | 1446 | | default: |
| | 1447 | | { |
| | 1448 | | if ( !omit ) |
| | 1449 | | printf( "DT Unknown\n" ); |
| | 1450 | | } |
| | 1451 | | } |
| | 1452 | | |
| | 1453 | | if ( !omit ) |
| | 1454 | | { |
| | 1455 | | |
| | 1456 | | |
| | 1457 | | if ( DD->array == TEV_DATA_ARRAY )
|
| | 1458 | | fprintf( ID->trace_out, " }" ); |
| | 1459 | | |
| | 1460 | | if ( DD->next != NULL )
|
| | 1461 | | fprintf( ID->trace_out, ", " ); |
| | 1462 | | } |
| | 1463 | | |
| | 1464 | | DD = DD->next; |