   PROCEDURE [INLINE] osp$sub_from_locked_variable (VAR variable:{Input, Output} integer;
         initial_best_guess: integer;
         amount_to_subtract: integer;
     VAR actual: integer;
     VAR error: boolean);

?? PUSH (LISTEXT := ON) ??

    VAR
      initial: integer,
      result: 0 .. 2;

    error := FALSE;
    IF initial_best_guess >= amount_to_subtract THEN
      initial := initial_best_guess;
    ELSE
      initial := amount_to_subtract;
    IFEND;

  /swap_in_subtraction/
    REPEAT
      #compare_swap (variable, initial, initial - amount_to_subtract, initial, result);
    UNTIL (result = 0) OR (initial < amount_to_subtract);
    IF result = 0 THEN
      actual := initial - amount_to_subtract;
    ELSE
      error := TRUE;
      actual := 0;
    IFEND;
  PROCEND osp$sub_from_locked_variable;
?? POP ??
