| | 451 | | |
| | 452 | | |
| | 453 | | |
| | 454 | | omit = ( ID->trace_out == NULL
|
| | 455 | | || ( TT != NULL && TRC_TASK_OMIT( TT ) ) )
|
| | 456 | | ? TRC_TRUE : TRC_FALSE;
|
| | 457 | | |
| | 458 | | |
| | 459 | | |
| | 460 | | nest = 0; |
| | 461 | | |
| | 462 | | done = 0; |
| | 463 | | |
| | 464 | | do |
| | 465 | | { |
| | 466 | | switch ( marker ) |
| | 467 | | { |
| | 468 | | case TEV_MARK_EVENT_BUFFER:
|
| | 469 | | { |
| | 470 | | nest++; |
| | 471 | | |
| | 472 | | break; |
| | 473 | | } |
| | 474 | | |
| | 475 | | case TEV_MARK_EVENT_BUFFER_END:
|
| | 476 | | { |
| | 477 | | if ( !(--nest) ) |
| | 478 | | done++; |
| | 479 | | |
| | 480 | | break; |
| | 481 | | } |
| | 482 | | |
| | 483 | | case TEV_MARK_DATA_ID:
|
| | 484 | | { |
| | 485 | | did_done = 0; |
| | 486 | | |
| | 487 | | do |
| | 488 | | { |
| | 489 | | TRC_PVMCKERR( pvm_upkint( &did_int, 1, 1 ),
|
| | 490 | | "Data ID Message", return( ecnt ) ); |
| | 491 | | |
| | 492 | | if ( did_int != TEV_MARK_DATA_ID_END )
|
| | 493 | | { |
| | 494 | | TRC_PVMCKERR( pvm_upkstr( did ),
|
| | 495 | | "Data ID Name", return( ecnt ) ); |
| | 496 | | |
| | 497 | | TRC_PVMCKERR( pvm_upkstr( diddesc ),
|
| | 498 | | "Data ID Description", return( ecnt ) ); |
| | 499 | | |
| | 500 | | dptr = (TRC_DID) trc_lookup_trie( TRC_DID_TRIE, |
| | 501 | | did ); |
| | 502 | | |
| | 503 | | if ( dptr == NULL
|
| | 504 | | || dptr->id != did_int |
| | 505 | | || strcmp( dptr->desc, diddesc ) ) |
| | 506 | | { |
| | 507 | | dptr = trc_create_did(); |
| | 508 | | |
| | 509 | | dptr->id = did_int; |
| | 510 | | |
| | 511 | | dptr->name = trc_copy_str( did ); |
| | 512 | | |
| | 513 | | dptr->desc = trc_copy_str( diddesc ); |
| | 514 | | |
| | 515 | | dptr->next = TRC_DID_LIST; |
| | 516 | | |
| | 517 | | TRC_DID_LIST = dptr; |
| | 518 | | |
| | 519 | | trc_add_to_trie( TRC_DID_TRIE, |
| | 520 | | dptr->name, (void *) dptr ); |
| | 521 | | } |
| | 522 | | |
| | 523 | | trc_set_didlist( H, dptr ); |
| | 524 | | } |
| | 525 | | |
| | 526 | | else |
| | 527 | | did_done++; |
| | 528 | | } |
| | 529 | | while ( !did_done ); |
| | 530 | | |
| | 531 | | if ( !nest ) |
| | 532 | | done++; |
| | 533 | | |
| | 534 | | break; |
| | 535 | | } |
| | 536 | | |
| | 537 | | case TEV_MARK_EVENT_DESC:
|
| | 538 | | { |
| | 539 | | TD = trc_create_tevdesc(); |
| | 540 | | |
| | 541 | | TD->refcount = 1; |
| | 542 | | |
| | 543 | | TRC_PVMCKERR( pvm_upkint( &eid, 1, 1 ),
|
| | 544 | | "Event Descriptor ID", return( ecnt ) ); |
| | 545 | | |
| | 546 | | TD->eid = eid & ~( TEV_EVENT_ENTRY | TEV_EVENT_EXIT );
|
| | 547 | | |
| | 548 | | if ( eid & TEV_EVENT_ENTRY )
|
| | 549 | | TD->entry_exit = TRC_ENTRY_TEV;
|
| | 550 | | |
| | 551 | | else if ( eid & TEV_EVENT_EXIT )
|
| | 552 | | TD->entry_exit = TRC_EXIT_TEV;
|
| | 553 | | |
| | 554 | | else |
| | 555 | | TD->entry_exit = TRC_IGNORE_TEV;
|
| | 556 | | |
| | 557 | | TRC_PVMCKERR( pvm_upkstr( tmp ),
|
| | 558 | | "Event Descriptor Name", return( ecnt ) ); |
| | 559 | | |
| | 560 | | TD->name = trc_copy_str( tmp ); |
| | 561 | | |
| | 562 | | desc_done = 0; |
| | 563 | | |
| | 564 | | do |
| | 565 | | { |
| | 566 | | TRC_PVMCKERR( pvm_upkint( &did_int, 1, 1 ),
|
| | 567 | | "Semantic Data ID", return( ecnt ) ); |
| | 568 | | |
| | 569 | | if ( did_int != TEV_MARK_EVENT_DESC_END )
|
| | 570 | | { |
| | 571 | | if ( TD->ddesc == NULL )
|
| | 572 | | DD = TD->ddesc = trc_create_datadesc(); |
| | 573 | | |
| | 574 | | else |
| | 575 | | DD = DD->next = trc_create_datadesc(); |
| | 576 | | |
| | 577 | | if ( H->didlist == NULL )
|
| | 578 | | { |
| | 579 | | printf( |
| | 580 | | "Warning: Missing DID List For Host %s\n", |
| | 581 | | H->name ); |
| | 582 | | } |
| | 583 | | |
| | 584 | | DD->did = trc_get_did( H, did_int ); |
| | 585 | | |
| | 586 | | if ( DD->did == NULL )
|
| | 587 | | { |
| | 588 | | printf( "Error: DID=%d Not Found\n", |
| | 589 | | did_int ); |
| | 590 | | |
| | 591 | | trc_free_tevdesc( &TD ); |
| | 592 | | |
| | 593 | | return( ecnt ); |
| | 594 | | } |
| | 595 | | |
| | 596 | | TRC_PVMCKERR( pvm_upkint( &dt, 1, 1 ),
|
| | 597 | | "Data Type", return( ecnt ) ); |
| | 598 | | |
| | 599 | | DD->dt = dt & |
| | 600 | | ~( TEV_DATA_SCALAR | TEV_DATA_ARRAY );
|
| | 601 | | |
| | 602 | | DD->array = dt & |
| | 603 | | ( TEV_DATA_SCALAR | TEV_DATA_ARRAY );
|
| | 604 | | |
| | 605 | | if ( !trc_unpack_data_value( DD ) ) |
| | 606 | | { |
| | 607 | | trc_free_tevdesc( &TD ); |
| | 608 | | |
| | 609 | | return( ecnt ); |
| | 610 | | } |
| | 611 | | } |
| | 612 | | |
| | 613 | | else |
| | 614 | | desc_done++; |
| | 615 | | } |
| | 616 | | while ( !desc_done ); |
| | 617 | | |
| | 618 | | dump_event = trc_add_tevdesc( ID, &TD, src, omit ); |
| | 619 | | |
| | 620 | | trc_set_tevlist( TT, H, TD ); |
| | 621 | | |
| | 622 | | if ( TD->dump ) |
| | 623 | | trc_dump_tevdesc( ID, TD, src ); |
| | 624 | | |
| | 625 | | if ( dump_event ) |
| | 626 | | trc_store_data_values( ID, TD, src, omit ); |
| | 627 | | |
| | 628 | | if ( !omit ) |
| | 629 | | ecnt++; |
| | 630 | | |
| | 631 | | if ( !nest ) |
| | 632 | | done++; |
| | 633 | | |
| | 634 | | break; |
| | 635 | | } |
| | 636 | | |
| | 637 | | case TEV_MARK_USER_EVENT_RECORD:
|
| | 638 | | { |
| | 639 | | TD = trc_create_tevdesc(); |
| | 640 | | |
| | 641 | | TD->refcount = 1; |
| | 642 | | |
| | 643 | | TRC_PVMCKERR( pvm_upkint( &eid, 1, 1 ),
|
| | 644 | | "Event Descriptor ID", return( ecnt ) ); |
| | 645 | | |
| | 646 | | TD->eid = eid & ~( TEV_EVENT_ENTRY | TEV_EVENT_EXIT );
|
| | 647 | | |
| | 648 | | if ( eid & TEV_EVENT_ENTRY )
|
| | 649 | | TD->entry_exit = TRC_ENTRY_TEV;
|
| | 650 | | |
| | 651 | | else if ( eid & TEV_EVENT_EXIT )
|
| | 652 | | TD->entry_exit = TRC_EXIT_TEV;
|
| | 653 | | |
| | 654 | | else |
| | 655 | | TD->entry_exit = TRC_IGNORE_TEV;
|
| | 656 | | |
| | 657 | | TRC_PVMCKERR( pvm_upkstr( tmp ),
|
| | 658 | | "Event Descriptor Name", return( ecnt ) ); |
| | 659 | | |
| | 660 | | TD->name = trc_copy_str( tmp ); |
| | 661 | | |
| | 662 | | |
| | 663 | | |
| | 664 | | DD = TD->ddesc = trc_create_datadesc(); |
| | 665 | | |
| | 666 | | DD->did = trc_get_did( (TRC_HOST) NULL, TEV_DID_TS );
|
| | 667 | | |
| | 668 | | DD->dt = TEV_DATA_INT;
|
| | 669 | | DD->array = TEV_DATA_SCALAR;
|
| | 670 | | |
| | 671 | | if ( !trc_unpack_data_value( DD ) ) |
| | 672 | | { |
| | 673 | | trc_free_tevdesc( &TD ); |
| | 674 | | |
| | 675 | | return( ecnt ); |
| | 676 | | } |
| | 677 | | |
| | 678 | | DD = DD->next = trc_create_datadesc(); |
| | 679 | | |
| | 680 | | DD->did = trc_get_did( (TRC_HOST) NULL, TEV_DID_TU );
|
| | 681 | | |
| | 682 | | DD->dt = TEV_DATA_INT;
|
| | 683 | | DD->array = TEV_DATA_SCALAR;
|
| | 684 | | |
| | 685 | | if ( !trc_unpack_data_value( DD ) ) |
| | 686 | | { |
| | 687 | | trc_free_tevdesc( &TD ); |
| | 688 | | |
| | 689 | | return( ecnt ); |
| | 690 | | } |
| | 691 | | |
| | 692 | | desc_done = 0; |
| | 693 | | |
| | 694 | | do |
| | 695 | | { |
| | 696 | | TRC_PVMCKERR( pvm_upkint( &dt, 1, 1 ),
|
| | 697 | | "Data Type", return( ecnt ) ); |
| | 698 | | |
| | 699 | | if ( dt != TEV_MARK_USER_EVENT_RECORD_END )
|
| | 700 | | { |
| | 701 | | DD = DD->next = trc_create_datadesc(); |
| | 702 | | |
| | 703 | | DD->dt = dt & |
| | 704 | | ~( TEV_DATA_SCALAR | TEV_DATA_ARRAY );
|
| | 705 | | |
| | 706 | | DD->array = dt & |
| | 707 | | ( TEV_DATA_SCALAR | TEV_DATA_ARRAY );
|
| | 708 | | |
| | 709 | | if ( !trc_unpack_data_value( DD ) ) |
| | 710 | | { |
| | 711 | | trc_free_tevdesc( &TD ); |
| | 712 | | |
| | 713 | | return( ecnt ); |
| | 714 | | } |
| | 715 | | } |
| | 716 | | |
| | 717 | | else |
| | 718 | | desc_done++; |
| | 719 | | } |
| | 720 | | while ( !desc_done ); |
| | 721 | | |
| | 722 | | dump_event = trc_add_tevdesc( ID, &TD, src, omit ); |
| | 723 | | |
| | 724 | | if ( TD->dump ) |
| | 725 | | trc_dump_tevdesc( ID, TD, src ); |
| | 726 | | |
| | 727 | | if ( dump_event ) |
| | 728 | | trc_store_data_values( ID, TD, src, omit ); |
| | 729 | | |
| | 730 | | if ( !omit ) |
| | 731 | | ecnt++; |
| | 732 | | |
| | 733 | | if ( !nest ) |
| | 734 | | done++; |
| | 735 | | |
| | 736 | | break; |
| | 737 | | } |
| | 738 | | |
| | 739 | | case TEV_MARK_EVENT_RECORD:
|
| | 740 | | { |
| | 741 | | TRC_PVMCKERR( pvm_upkint( &eid, 1, 1 ),
|
| | 742 | | "Event ID", return( ecnt ) ); |
| | 743 | | |
| | 744 | | if ( eid & TEV_EVENT_ENTRY )
|
| | 745 | | entry_exit = TRC_ENTRY_TEV;
|
| | 746 | | |
| | 747 | | else if ( eid & TEV_EVENT_EXIT )
|
| | 748 | | entry_exit = TRC_EXIT_TEV;
|
| | 749 | | |
| | 750 | | else |
| | 751 | | entry_exit = TRC_IGNORE_TEV;
|
| | 752 | | |
| | 753 | | eid &= ~( TEV_EVENT_ENTRY | TEV_EVENT_EXIT );
|
| | 754 | | |
| | 755 | | TD = trc_get_tevdesc( TT, H, eid, entry_exit ); |
| | 756 | | |
| | 757 | | if ( TD != NULL )
|
| | 758 | | { |
| | 759 | | if ( trc_store_trace_event( ID, TD, src, omit ) ) |
| | 760 | | ecnt++; |
| | 761 | | } |
| | 762 | | |
| | 763 | | else |
| | 764 | | { |
| | 765 | | printf( |
| | 766 | | "Error: Event ID %d(%d) %s T(%d/%x) H(%d/%x)\n", |
| | 767 | | eid, entry_exit, "Descriptor Not Found", |
| H <= 4095 | 768 | | TT->tid, TT->tid, H->pvmd_tid, H->pvmd_tid ); |
| | 769 | | } |
| | 770 | | |
| | 771 | | if ( !nest ) |
| | 772 | | done++; |
| | 773 | | |
| | 774 | | break; |
| | 775 | | } |
| | 776 | | } |
| | 777 | | |
| | 778 | | if ( !done ) |
| | 779 | | { |
| | 780 | | TRC_PVMCKERR( pvm_upkint( &marker, 1, 1 ),
|
| | 781 | | "Unpacking Trace Message", return( ecnt ) ); |
| | 782 | | } |
| | 783 | | } |
| | 784 | | while ( !done ); |