{ *************************************************************************** } MODULE mod_soft_conn_dispatch ; { Created 26-APR-1989 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE } { *************************************************************************** } INCLUDE mod_common_soft_conn, mod_common_parse, mod_handle_console, mod_handle_tracing, mod_parse_detail, mod_tree_dispatch, mod_coor_dispatch, mod_l15ct_dispatch, mod_phat_dispatch, mod_test, $KERNEL ; { from ELN$:RTLOBJECT.OLB } { *************************************************************************** } EXPORT init_dispatch, {PROCEDURE start dispatching task process } soft_conn_disp, {PROCEDURE first level parsing of request messages } create_dispatching_task, {PROCEDURE start/restart dispatcing process } delete_dispatching_task; {PROCEDURE forces the dispatching process to exit } { *************************************************************************** } IMPORT replymsg, reqstmsg, {from module MOD_COMMON_SOFT_CONN } con_served, {from module MOD_COMMON_SOFT_CONN } new_message, msg_consumed, {from module MOD_COMMON_SOFT_CONN } disp_not_busy, {from module MOD_COMMON_SOFT_CONN } param, {from module MOD_COMMON_SOFT_CONN } proc_dispatch, name_dispatch, {from module MOD_COMMON_SOFT_CONN } parsed_command, {from module MOD_COMMON_PARSE } unknown_msg, {from module MOD_PARSE_DETAIL } lock_console, {from module MOD_HANDLE_CONSOLE } unlock_console, {from module MOD_HANDLE_CONSOLE } handle_trc_sys, {from module MOD_HANDLE_TRACING } handle_trc_sta, {from module MOD_HANDLE_TRACING } handle_exception, {from module MOD_HANDLE_TRACING } set_trc_exc_mode, {from module MOD_HANDLE_TRACING } tree_disp, {from module MOD_TREE_DISPATCH } coor_disp, {from module MOD_COOR_DISPATCH } l15ct_disp, {from module MOD_L15CT_DISPATCH } phat_disp, {from module MOD_PHAT_DISPATCH } test_scan_card_reg, {from module MOD_TEST } KER$NAME_OBJECT ; {from module $KERNEL } { *************************************************************************** } { *************************************************************************** } TYPE byte = [BYTE] 0..255 ; VAR dispatch_exists : byte := 0 ; { *************************************************************************** } { *************************************************************************** } PROCESS_BLOCK block_comm_dispatch ; VAR status : INTEGER ; BEGIN {define an exception handler for this process block **** } ESTABLISH ( exchand_soft_conn_disp ) ; {start an infinite loop **** } REPEAT {advertise idleness to recieving process(es) **** } SIGNAL (disp_not_busy, STATUS := status ) ; IF ( status <> 1 ) THEN handle_trc_sta ( TAG := 'DSP/SIG%not_busy%', STATUS := status ) ; {wait for a new message to service **** } WAIT_ANY (new_message, STATUS := status ) ; IF ( status <> 1 ) THEN handle_trc_sta ( TAG := 'DSP/WAI%new_msg%', STATUS := status ) ; {dispatch and execute request **** } soft_conn_disp ; {advertise that the message has been serviced **** } SIGNAL (msg_consumed, STATUS := status ) ; IF ( status <> 1 ) THEN handle_trc_sta ( TAG := 'DSP/SIG%consumed%', STATUS := status ) ; {infinite loop return **** } UNTIL FALSE ; {forever } END; {end of process_block} { ************************************************************************* } { ************************************************************************* } PROCEDURE soft_conn_disp ; {*** this declaration is also repeated as EXTERNAL in mod_init_auxi *** } {*** remember to propagate any change *** } BEGIN {initialize reply status **** } replymsg[con_served]^.replystat := ' OK' ; replymsg[con_served]^.replysupl := ' DONE' ; {transmit command to appropriate dispatching routine **** } IF ( reqstmsg[con_served]^.objecttype = 'SPECTRIG' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = ' INITIAL' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = ' PAUSE' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = ' RESUME' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = 'WRT_HOST' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = ' STOP' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = 'AUTOTUNE' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = 'GEO_SECT' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = ' REFSET' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = ' EXCLUDE' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = 'THRESHLD' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = 'DAC_BYTE' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = 'ST_VS_RS' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = 'LEVEL_15' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = 'TRIG_TWR' ) THEN coor_disp ELSE IF ( reqstmsg[con_served]^.objecttype = 'L15CTERM' ) THEN l15ct_disp ELSE IF ( reqstmsg[con_served]^.objecttype = 'L15CTSYS' ) THEN l15ct_disp ELSE IF ( reqstmsg[con_served]^.objecttype = ' PHAT' ) THEN phat_disp ELSE IF ( reqstmsg[con_served]^.objecttype = ' TREE' ) THEN tree_disp ELSE IF ( reqstmsg[con_served]^.objecttype = 'ENG_TREE' ) THEN tree_disp ELSE IF ( reqstmsg[con_served]^.objecttype = 'CNT_TREE' ) THEN tree_disp ELSE IF ( reqstmsg[con_served]^.objecttype = 'TESTDUMP' ) THEN test_scan_card_reg ELSE unknown_msg (TAGEXT := 'G'+SUBSTR(reqstmsg[con_served]^.reqstid,7,2)); END ; { ************************************************************************* } { ************************************************************************* } PROCEDURE init_dispatch ; VAR status : INTEGER; {general use status buffer} BEGIN { create and initialize message consumed semaphore **** } CREATE_SEMAPHORE ( msg_consumed, 0, 1, STATUS := status ) ; handle_trc_sta ( TAG := 'CRE/SEM%msgcons', STATUS := status ) ; { create and initialize new message semaphore **** } CREATE_SEMAPHORE ( new_message, 0, 1, STATUS := status ) ; handle_trc_sta ( TAG := 'CRE/SEM%newmsg', STATUS := status ) ; { create and initialize dispatcher task idleness semaphore **** } CREATE_SEMAPHORE ( disp_not_busy, 0, 1, STATUS := status ) ; handle_trc_sta ( TAG := 'CRE/SEM%busybar', STATUS := status ) ; {allocate memory for arguments and parsed message array **** } NEW ( param ) ; NEW ( parsed_command ) ; { start process consuming the different messages **** } create_dispatching_task ; END ; { ************************************************************************* } { ************************************************************************* } PROCEDURE create_dispatching_task ; VAR status : INTEGER; {general use status buffer} BEGIN IF ( dispatch_exists = 0 ) THEN BEGIN CREATE_PROCESS ( proc_dispatch, block_comm_dispatch, STATUS := status ); handle_trc_sta ( TAG := 'CRE/PRC%dispatch', STATUS := status ) ; KER$NAME_OBJECT ( name_dispatch, 'DISPATCH', proc_dispatch, STATUS := status ) ; handle_trc_sta ( TAG := 'NAM/PRC%dispatch', STATUS := status ) ; dispatch_exists := 1 ; END ELSE handle_trc_sys ( TAG := 'PHT/SYS%', MESSAGE := ' Dispatching Task Already Active' ) ; END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE delete_dispatching_task ; VAR status : INTEGER; {general use status buffer} BEGIN lock_console ; SIGNAL ( proc_dispatch, STATUS := status ) ; unlock_console ; handle_trc_sta ( TAG := 'SIG/PRC%dispatch', STATUS := status ) ; DELETE ( name_dispatch, STATUS := status ); handle_trc_sta ( TAG := 'DEL/NAM%dispatch', STATUS := status ) ; dispatch_exists := 0 ; END ; { *************************************************************************** } { *************************************************************************** } FUNCTION exchand_soft_conn_disp OF TYPE EXCEPTION_HANDLER ; VAR decoded_stat : VARYING_STRING(255) ; BEGIN set_trc_exc_mode ( TRUE ) ; replymsg[con_served]^.replystat := ' BAD' ; replymsg[con_served]^.replysupl := 'EXC-DISP' ; exchand_soft_conn_disp := handle_exception ( TAG := 'DSP/EXC%', EXC_CODE := signal_args.name, DECODED := decoded_stat ) ; replymsg[con_served]^.replystring := decoded_stat ; set_trc_exc_mode ( FALSE ) ; END ; { *************************************************************************** } { *************************************************************************** } END .