
  PROCEDURE [INLINE] iop$set_queue_lockword
    (VAR queue_lockword: iot$lockword;
     VAR lock_set: boolean);

?? PUSH (LISTEXT := ON) ??

    VAR
      actual_lock: iot$lockword,
      count: integer,
      result: 0 .. 2,
      time: integer,
      timeout: integer;

    #COMPARE_SWAP (queue_lockword, iov$initial_queue_lock, iov$queue_lock_set,
          actual_lock, result);
    lock_set := result = 0;

    IF NOT lock_set THEN
      time := #FREE_RUNNING_CLOCK (0);
      timeout := time + 2000000;
      count := 0;

      REPEAT
        #COMPARE_SWAP (queue_lockword, iov$initial_queue_lock,
              iov$queue_lock_set, actual_lock, result);

        lock_set := result = 0;
        count := count + 1;
        IF count >= 100 THEN
          time := #FREE_RUNNING_CLOCK (0);
          count := 0;
        IFEND;
      UNTIL lock_set OR (time > timeout);
    IFEND

  PROCEND iop$set_queue_lockword;

*copyc iot$unit_interface_table
*copyc iov$initial_queue_lock
*copyc iov$queue_lock_set
?? POP ??

