  PROCEDURE [INLINE] osp$test_sig_lock
    (VAR lock: ost$signature_lock;
     VAR lock_status: ost$signature_lock_status);

?? PUSH (LISTEXT := ON) ??

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

    REPEAT
      #COMPARE_SWAP (lock.lock_id, 0, 0, actual_value, cs_status);
    UNTIL cs_status <> osc$cs_variable_locked;
    IF cs_status = osc$cs_successful THEN
      lock_status := osc$sls_not_locked;
    ELSE
      xcb_p := #ADDRESS (1, osc$segnum_job_fixed_heap,
            #READ_REGISTER (osc$pr_base_constant));
      task_id := xcb_p^.global_task_id;
      current_task_value := task_id.index * 256 *
            #SIZE (task_id.seqno) + task_id.seqno;
      IF actual_value = current_task_value THEN
        lock_status := osc$sls_locked_by_current_task;
      ELSE
        lock_status := osc$sls_locked_by_another_task;
      IFEND;
    IFEND;

  PROCEND osp$test_sig_lock;

*copyc osh$test_signature_lock
*copyc ost$signature_lock
*copyc ost$heap
*copyc osc$processor_defined_registers
*copyc ost$execution_control_block
?? POP ??
