?? RIGHT := 110 ??
MODULE mmm$log_caller;

  TYPE
    sfsa_type = record
      fill1: 0 .. 0ffff(16),
      p: ^cell,
    a0, a1: integer, fill2: 0 .. 0ffff(16), a2: ^sfsa_type,
  recend;

  TYPE
    proc_id_type = record
      p0,p1,p2,p3:          0 .. 0ffffffff(16),
    recend,
    proc_info_type = record
      id: proc_id_type,
      count: array [boolean] of integer,
    recend;

  CONST
    pid_size = 300;


  VAR
    mmv$log_enable: [XDCL] integer,
    start_time: integer,
    last_time: integer,
    count: integer,
    pid: array [0 .. pid_size] of proc_info_type,
    max_pid: integer;

?? EJECT ??

  PROCEDURE[XDCL] mmp$log_caller_proc (b: boolean);

    VAR
      offset,
      i: integer,
      id: proc_id_type,
      sfsa_p: ^sfsa_type,
      zid: [STATIC] proc_id_type := [0,0,0,0];

    IF mmv$log_enable = 0 THEN
      RETURN;
    ELSEIF mmv$log_enable = 1 THEN
      count := 0;
      start_time := #free_running_clock (0);
      mmv$log_enable := 2;
      FOR i := 0 TO pid_size DO
        pid [i].id := zid;
        pid [i].count [FALSE] := 0;
        pid [i].count [TRUE] := 0;
      FOREND;
      max_pid := 0;
    IFEND;

    count := count + 1;
    last_time := #free_running_clock (0);
    sfsa_p := #previous_save_area ();
    id := zid;
    i := 0;
    WHILE (sfsa_p <> NIL) AND (i < 4) DO
      offset   := #offset (sfsa_p^.p);
      CASE i of
       =0= id.p0:=offset;
       =1= id.p1:=offset;
       =2= id.p2:=offset;
       =3= id.p3:=offset;
      casend;
      sfsa_p := sfsa_p^.a2;
      i := i + 1;
    WHILEND;

    i := 0;
    WHILE pid [i].id  <> id DO
      IF i = max_pid THEN
        IF i = pid_size THEN
          RETURN;
        IFEND;
        pid [i].id := id;
        max_pid := i + 1;
      ELSE
        i := i + 1;
      IFEND;
    WHILEND;

    pid [i].count [b] := pid [i].count [b] + 1;

  PROCEND mmp$log_caller_proc;
MODEND
