
  PROCEDURE [INLINE] gfp$set_signature_lock
    (VAR lock: gft$signature_lock);

?? PUSH (LISTEXT := ON) ??

      VAR
        already_locked: boolean,
        cnv: RECORD
          CASE boolean OF
          = FALSE =
            i: integer,
          = TRUE =
            fill: 0 .. 0FFFF(16),
            p: ^cell,
          CASEND,
        RECEND,
        cycle_rb: tmt$rb_cycle,
        task_id: ost$global_task_id,
        xcb_p: ^ost$execution_control_block;

      xcb_p := #ADDRESS (1, osc$segnum_job_fixed_heap,
            #READ_REGISTER (osc$pr_base_constant));
      task_id := xcb_p^.global_task_id;

      IF lock.locked AND (lock.gtid = task_id) THEN
        lock.count := lock.count + 1;
        lock.p_register_2 := #read_register (64);      {!!!### debug code}
      ELSE
        WHILE TRUE DO
          xcb_p^.system_table_lock_count := xcb_p^.system_table_lock_count + 256;
          #TEST_SET (lock.locked, already_locked);
          IF NOT already_locked THEN
            lock.gtid := task_id;
            lock.p_register := #read_register (64);      {!!!### debug code}
            RETURN;
          IFEND;
          xcb_p^.system_table_lock_count := xcb_p^.system_table_lock_count - 256;
          cycle_rb.reqcode := syc$rc_cycle;
          cycle_rb.code := tmc$cyc_set_fde_lock;
          cycle_rb.lock_value := lock.gtid.index * 256 + lock.gtid.seqno;
          cnv.i := #read_register (64);
          cycle_rb.p1 := cnv.p;
          cycle_rb.p2 := #LOC (lock);
          i#call_monitor (#LOC (cycle_rb), #SIZE (cycle_rb));
        WHILEND;
      IFEND;

  PROCEND gfp$set_signature_lock;
*copyc gft$signature_lock
*copyc osc$processor_defined_registers
*copyc ost$execution_control_block
*copyc ost$heap
*copyc osp$system_error
*copyc tmt$rb_cycle
?? POP ??
