MODULE osm$log_caller_r1;

  VAR
    osv$switch_on: [XDCL] boolean := FALSE,
    id_table: array [1 .. 30] of RECORD
      p_address: ^cell,
      log_p: ^log_table,
      total: 0 .. 0ffffffff(16),
    RECEND := [REP 30 of [NIL, NIL, 0]];

  TYPE
    sfsa = RECORD
      fill1: string (2),
      p: ^cell,
      fill2: string (18),
      a2: ^sfsa,
    RECEND,
    log_table = array [1 .. 100] of RECORD
      fill1: 0 .. 0ffff(16),
      p_address: ^cell,
      count: integer,
    RECEND;

*copyc osv$mainframe_wired_heap

PROCEDURE [XDCL, #GATE] osp$log_caller_r1;

  VAR
    r1_p: ^sfsa,
    local_log_p: ^log_table,
    i,
    j: integer;

  IF osv$switch_on THEN
    r1_p := #previous_save_area ();
    i := 0;
    REPEAT
      i := i + 1;
    UNTIL (i > UPPERBOUND (id_table)) OR (r1_p^.a2^.p = id_table [i].
          p_address) OR (id_table [i].p_address = NIL);

    IF i > UPPERBOUND (id_table) THEN
      RETURN;
    IFEND;

    IF (id_table [i].p_address <> NIL) AND (id_table [i].log_p = NIL) THEN
      RETURN;
    IFEND;

    IF id_table [i].p_address = NIL THEN
      id_table [i].p_address := r1_p^.a2^.p;
      ALLOCATE local_log_p IN osv$mainframe_wired_heap^;
      FOR j := 1 TO 100 DO
        local_log_p^ [j].fill1 := 0;
        local_log_p^ [j].p_address := NIL;
        local_log_p^ [j].count := 0;
      FOREND;
      id_table [i].log_p := local_log_p;
    IFEND;

    id_table [i].total := id_table [i].total + 1;

    j := 0;
    REPEAT
      j := j + 1;
    UNTIL (j > UPPERBOUND (log_table)) OR (r1_p^.a2^.a2^.p = id_table [i].
          log_p^ [j].p_address) OR (id_table [i].log_p^ [j].p_address = NIL);

    IF j > UPPERBOUND (log_table) THEN
      RETURN;
    IFEND;

    IF id_table [i].log_p^ [j].p_address = NIL THEN
      id_table [i].log_p^ [j].p_address := r1_p^.a2^.a2^.p;
    IFEND;
    id_table [i].log_p^ [j].count := id_table [i].log_p^ [j].count + 1;
  IFEND;
PROCEND osp$log_caller_r1;
MODEND osm$log_caller_r1;

