 PROCEDURE [INLINE] osp$decrement_locked_variable (VAR variable: integer;
        initial_best_guess: integer;
    VAR actual: integer;
    VAR error: boolean);

{Actual will contain the final contents of the variable.

?? PUSH (LISTEXT := ON) ??

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

    error := FALSE;
*IF NOT $true(osv$unix)
    IF initial_best_guess <= 0 THEN
      initial := 1;
    ELSE
      initial := initial_best_guess;
    IFEND;
    REPEAT
      #compare_swap (variable, initial, initial - 1, initial, result);
    UNTIL (result = 0) OR (initial = 0);
    IF result = 0 THEN
      actual := initial - 1;
    ELSE
      error := TRUE;
      actual := 0;
    IFEND;
*ELSE

    IF variable > 0 THEN
      variable := variable - 1;
      actual := variable;
    ELSE
      error := TRUE;
      actual := 0;
    IFEND;

*IFEND
  PROCEND osp$decrement_locked_variable;
?? POP ??
