| 791 | | trc_handle_output_message( ID ) |
| 792 | | TRC_ID ID; |
| 793 | | { |
| 794 | | TRC_TEVTASK TT; |
| 795 | | |
| 796 | | char tmp[255]; |
| 797 | | char msg[255]; |
| 798 | | |
| 799 | | char *output; |
| 800 | | |
| 801 | | int ecnt; |
| 802 | | int omit; |
| 803 | | int len; |
| 804 | | int tid; |
| 805 | | |
| 806 | | ecnt = 0; |
| 807 | | |
| 808 | | TRC_PVMCKERR( pvm_upkint( &tid, 1, 1 ),
|
| 809 | | "Error Unpacking Output Message", return( ecnt ) ); |
| 810 | | |
| 811 | | TRC_PVMCKERR( pvm_upkint( &len, 1, 1 ),
|
| 812 | | "Error Unpacking Output Length", return( ecnt ) ); |
| 813 | | |
| 814 | | |
| 815 | | |
| 816 | | TT = trc_get_tevtask_tid( ID, tid ); |
| 817 | | |
| 818 | | omit = ( ID->trace_out == NULL
|
| 819 | | || ( TT != NULL && TRC_TASK_OMIT( TT ) ) )
|
| 820 | | ? TRC_TRUE : TRC_FALSE;
|
| 821 | | |
| 822 | | |
| 823 | | |
| 824 | | if ( len > 0 ) |
| 825 | | { |
| 826 | | output = (char *) malloc( (unsigned) ( len + 1 ) |
| 827 | | * sizeof(char) ); |
| 828 | | trc_memcheck( output, "PVM Output String" ); |
| 829 | | |
| 830 | | TRC_PVMCKERR( pvm_upkbyte( output, len, 1 ),
|
| 831 | | "Error Unpacking Task Output", |
| 832 | | free(output); return( ecnt ) ); |
| 833 | | |
| 834 | | output[ len ] = '\0'; |
| 835 | | |
| 836 | | if ( !omit ) |
| 837 | | ecnt = trc_store_output_event( ID, tid, output, len ); |
| 838 | | |
| 839 | | free( output ); |
| 840 | | } |
| 841 | | |
| 842 | | else |
| 843 | | { |
| 844 | | switch ( len ) |
| 845 | | { |
| 846 | | case 0: |
| 847 | | { |
| 848 | | if ( !omit ) |
| 849 | | { |
| 850 | | sprintf( tmp, "GOTEOF\n" ); |
| 851 | | |
| 852 | | ecnt = trc_store_output_event( ID, |
| 853 | | tid, tmp, strlen(tmp) ); |
| 854 | | } |
| 855 | | |
| 856 | | if ( TT != NULL )
|
| 857 | | { |
| 858 | | if ( TT->tevstatus == TRC_TASK_ALIVE )
|
| 859 | | { |
| 860 | | TT->outstatus = TRC_TASK_EOF;
|
| 861 | | |
| 862 | | trc_check_for_dead_host( ID, TT ); |
| 863 | | |
| 864 | | if ( !trc_tevtasks_alive( ID ) ) |
| 865 | | trc_end_trace( ID ); |
| 866 | | } |
| 867 | | |
| 868 | | else |
| 869 | | TT->outstatus = TRC_TASK_EOF;
|
| 870 | | } |
| 871 | | |
| 872 | | else if ( !omit ) |
| 873 | | { |
| 874 | | printf( |
| 875 | | "\nWarning: GOTEOF Unknown Task TID=0x%x.\n\n", |
| 876 | | tid ); |
| 877 | | } |
| 878 | | |
| 879 | | break; |
| 880 | | } |
| 881 | | |
| 882 | | case -1: |
| 883 | | { |
| 884 | | if ( omit ) |
| 885 | | break; |
| 886 | | |
| 887 | | sprintf( tmp, "GOTSPAWN\n" ); |
| 888 | | |
| 889 | | ecnt = trc_store_output_event( ID, |
| 890 | | tid, tmp, strlen(tmp) ); |
| 891 | | |
| 892 | | if ( TT == NULL )
|
| 893 | | { |
| 894 | | sprintf( msg, "Task TID=0x%x Connected to %s", |
| 895 | | tid, TRC_NAME ); |
| 896 | | |
| 897 | | trc_status_msg( ID, msg ); |
| 898 | | |
| 899 | | TT = trc_create_tevtask(); |
| 900 | | |
| 901 | | TT->tid = tid; |
| 902 | | |
| 903 | | TT->outstatus = TRC_TASK_OUT;
|
| 904 | | TT->tevstatus = TRC_TASK_NOLIFE;
|
| 905 | | |
| 906 | | TT->next = ID->tevtask_list; |
| 907 | | |
| 908 | | ID->tevtask_list = TT; |
| 909 | | } |
| 910 | | |
| 911 | | else |
| 912 | | TT->outstatus = TRC_TASK_OUT;
|
| 913 | | |
| 914 | | break; |
| 915 | | } |
| 916 | | |
| 917 | | case -2: |
| 918 | | { |
| 919 | | if ( omit ) |
| 920 | | break; |
| 921 | | |
| 922 | | sprintf( tmp, "CREATION\n" ); |
| 923 | | |
| 924 | | ecnt = trc_store_output_event( ID, |
| 925 | | tid, tmp, strlen(tmp) ); |
| 926 | | |
| 927 | | if ( TT == NULL )
|
| 928 | | { |
| 929 | | sprintf( msg, "Task TID=0x%x Connected to %s", |
| 930 | | tid, TRC_NAME ); |
| 931 | | |
| 932 | | trc_status_msg( ID, msg ); |
| 933 | | |
| 934 | | TT = trc_create_tevtask(); |
| 935 | | |
| 936 | | TT->tid = tid; |
| 937 | | |
| 938 | | TT->outstatus = TRC_TASK_OUT;
|
| 939 | | TT->tevstatus = TRC_TASK_NOLIFE;
|
| 940 | | |
| 941 | | TT->next = ID->tevtask_list; |
| 942 | | |
| 943 | | ID->tevtask_list = TT; |
| 944 | | } |
| 945 | | |
| 946 | | else |
| 947 | | TT->outstatus = TRC_TASK_OUT;
|
| 948 | | |
| 949 | | break; |
| 950 | | } |
| 951 | | |
| 952 | | default: |
| 953 | | { |
| 954 | | if ( !omit ) |
| 955 | | { |
| 956 | | fprintf( stderr, |
| 957 | | "Console: unknown output msg 0x%x?\n", tid ); |
| 958 | | } |
| 959 | | } |
| 960 | | } |
| 961 | | } |
| 962 | | |
| 963 | | return( ecnt ); |
| 964 | | } |