
  PROCEDURE [INLINE] fmp$lock_path_table
    (VAR status: ost$status);

?? PUSH (LISTEXT := ON) ??

    VAR
      actual_value: integer,
      cs_status: 0 .. 2,
      new_value: integer,
      task_id: ost$global_task_id,
      xcb_p: ^ost$execution_control_block;

    status.normal := TRUE;
    xcb_p := #ADDRESS (1, osc$segnum_job_fixed_heap,
          #READ_REGISTER (osc$pr_base_constant));
    task_id := xcb_p^.global_task_id;
    new_value := task_id.index * 256 * #SIZE (task_id.seqno) + task_id.seqno;

  /lock_loop/
    WHILE TRUE DO
      REPEAT
        #COMPARE_SWAP (fmv$path_table_lock.lock_id, 0, new_value, actual_value,
              cs_status);
      UNTIL cs_status <> osc$cs_variable_locked;

      IF cs_status = osc$cs_successful THEN
        RETURN; {----->
      IFEND;

      IF new_value = actual_value THEN
        osp$set_status_condition (fme$pt_locked_by_current_task, status);
        RETURN; {----->
      IFEND;
      syp$cycle_for_lock (tmc$cyc_set_job_lock, ^fmv$path_table_lock);
    WHILEND /lock_loop/;

  PROCEND fmp$lock_path_table;

*copyc osc$processor_defined_registers
*copyc fme$file_management_errors
*copyc ost$execution_control_block
*copyc ost$heap
*copyc ost$signature_lock
*copyc osp$set_status_condition
*copyc syp$cycle_for_lock
*copyc fmv$path_table_lock
?? POP ??

