CAC 2016-11-28

Tracking down FNP hang.

tty_dump reports "blocked on output"

          if wtcb.wflag
          then call ioa_ ("process blocked on output");
tty_index.pl1:

          if wtcb.flags.dialed
          then wtcb.flags.wflag, wtcb.flags.rflag = "0"b;   /* force wakeups */

and:

               if code = 0
               then if wr_stat.output_pending
                    then wtcb.flags.wflag = "1"b;           /* get wakeup when it is gone */
          end;

tty_write.pl1:

                    /*** If we did not consume all of our caller's output but
                    generated no output, ensure that the process sees a wakeup
                    so that the rest of the output will be handled. */

                    if wtcb.send_output                     /* nothing in progress */
                    then do;
                         unspec (net_event_message) = "0"b;
                         net_event_message.version = NET_EVENT_MESSAGE_VERSION_1;
                         net_event_message.network_type = MCS_NETWORK_TYPE;
                         net_event_message.handle = devx;
                         net_event_message.type = MCS_WRITE_MSG;
                         call pxss$ring_0_wakeup (wtcb.uproc, wtcb.event, net_event_message_arg, (0));
                         wtcb.wflag = "0"b;
                    end;
                    else wtcb.flags.wflag = "1"b;           /* so wakeup will happen when write completes */

and:

nothing_written:
          if wtcb.send_output
          then call tty_space_man$needs_space (devx);       /* make sure space happens anyway */
          else wtcb.wflag = "1"b;
          ercode = 0;
          go to all_done;                                   /* exit */

tty_interrupt.pl1:

               if wtcb.write_first = 0                      /* no write chain left */
               then if wtcb.wflag                           /* user is waiting to be told when output is done */
                    then do;
                         unspec (net_event_message) = "0"b;
                         net_event_message.version = NET_EVENT_MESSAGE_VERSION_1;
                         net_event_message.network_type = MCS_NETWORK_TYPE;
                         net_event_message.handle = devx;
                         net_event_message.type = MCS_WRITE_MSG;
                         call pxss$ring_0_wakeup (wtcb.uproc, wtcb.event, net_event_message_arg, (0));
                         wtcb.wflag = "0"b;
                    end;

and:

               if wtcb.wflag | wtcb.rflag                   /* if process was blocked on output or input */
               then do;
                    if wtcb.wflag
                    then net_event_message.type = MCS_WRITE_MSG;
                                                            /* set message type accordingly */
                    else net_event_message.type = MCS_READ_MSG;
                    call meter_response_time (wtcb.uproc, TTY_WAKEUP);
                    call pxss$ring_0_wakeup (wtcb.uproc, wtcb.event, net_event_message_arg, 0);
                                                            /* wakeup the user */
                    wtcb.wflag, wtcb.rflag = "0"b;
               end;

wflag                    13(12)        based           bit(1)                   level 3 packed packed unaligned dcl 5-22 set ref

tty_index: bound_tty_active 147:22024

      666           if wtcb.flags.dialed
      667           then wtcb.flags.wflag, wtcb.flags.rflag = "0"b;   /* force wakeups */
666 002473

      845                if code = 0
      846                then if wr_stat.output_pending
      847                     then wtcb.flags.wflag = "1"b;           /* get wakeup when it is gone */

845 003365 

tty_write: bound_tty_active 147:2602

                                                            STATEMENT 1 ON LINE 1004
                         wtcb.wflag = "0"b;

002652  aa   003602 2350 04   lda       1922,ic             006454 = 777737777777
002653  aa  6 00040 3735 20   epp7      pr6|32,*
002654  aa  7 00326 3715 20   epp5      pr7|214,*           wtcbp
002655  aa  5 00013 3551 00   ansa      pr5|11              wtcb.wflag

                                                            STATEMENT 1 ON LINE 1006
                    else wtcb.flags.wflag = "1"b;

002657  aa   000040 2350 03   lda       32,du
002660  aa  1 00013 2551 00   orsa      pr1|11              wtcb.wflag

                                                            STATEMENT 1 ON LINE 2041
          else wtcb.wflag = "1"b;

006167  aa   000040 2350 03   lda       32,du
006170  aa  7 00013 2551 00   orsa      pr7|11

tty_interrupt bound_355_wired 122:27256

      228                then if wtcb.wflag                           /* user is waiting to be told when output is done */

      236                          wtcb.wflag = "0"b;
236 000442

      582                     wtcb.wflag, wtcb.rflag = "0"b;
82 002176 

Interrupt checking flags

tty_interrupt 122:27256
line 227 offset 000375
027256+0375 -> 027653
sbr 0122:027653 echo interrupt check flags; continue

interrupt clearing wflag
tty_interrupt 122:27256
line 236 offset 000442
027256+0442 -> 027720
sbr 0122:027720 echo interrupt clear wflag; continue

set flag 1
tty_write 147:2602
line 1006 offset 002660
002660+02602 ->5462
sbr 0147:05462 echo write set 1; continue

set flag 2
tty_write 147:2602
line 2041 offset 006170
006170+02602 -> 05462
sbr 0147:10772 echo write set 2; continue
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License