
  PROCEDURE [INLINE] iop$set_queue_lockword_sc
    (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;

    osp$begin_system_activity;
    #COMPARE_SWAP (queue_lockword, iov$initial_queue_lock_sc,
          iov$queue_lock_set_sc, actual_lock, result);
    lock_set := result = 0;

    IF NOT lock_set THEN
      osp$end_system_activity;
      syp$cycle;

      time := #FREE_RUNNING_CLOCK (0);
      timeout := time + 2000000;
      count := 0;

      REPEAT
        osp$begin_system_activity;
        #COMPARE_SWAP (queue_lockword, iov$initial_queue_lock_sc,
              iov$queue_lock_set_sc, actual_lock, result);

        lock_set := result = 0;
        count := count + 1;
        IF count >= 100 THEN
          time := #FREE_RUNNING_CLOCK (0);
          count := 0;
        IFEND;
        IF NOT lock_set THEN
          osp$end_system_activity;
          syp$cycle;
        IFEND;
      UNTIL lock_set OR (time > timeout);
    IFEND

  PROCEND iop$set_queue_lockword_sc;

*copyc iot$unit_interface_table
*copyc osp$begin_system_activity
*copyc osp$end_system_activity
*copyc syp$cycle
*copyc iov$initial_queue_lock_sc
*copyc iov$queue_lock_set_sc
?? POP ??
