
  PROCEDURE [INLINE] dfp$set_read_lock
    (VAR read_write_lock:{Input, Output} dft$read_write_lock);

    VAR
      already_zero: boolean,
      ignored_status: ost$status,
      new_value: integer,
      temp_writer_count: integer,
      writer_count: integer;

  /increment_read_count/
    REPEAT
      osp$increment_locked_variable (
            read_write_lock.reader_count, { Best guess = } 0, new_value);
      osp$fetch_locked_variable (read_write_lock.writer_count, writer_count);
      IF writer_count > 0 THEN
        osp$increment_locked_variable (
              read_write_lock.reject_count, {Best guess = } 0, new_value);
        osp$decrement_locked_variable (read_write_lock.reader_count,
              { Best guess = } 1, new_value, already_zero);
        IF already_zero THEN
          osp$system_error (' READ LOCK ALREADY ZERO ', NIL);
        IFEND;

      /wait_for_writer_completion/
        REPEAT
          pmp$delay ({milliseconds} 2, ignored_status);
          osp$fetch_locked_variable (read_write_lock.writer_count,
                temp_writer_count);
        UNTIL (temp_writer_count = 0);
      IFEND;
    UNTIL (writer_count = 0);

    osp$begin_system_activity;
  PROCEND dfp$set_read_lock;
?? PUSH (LISTEXT := ON) ??
*copyc dft$read_write_lock
*copyc osp$begin_system_activity
*copyc osp$decrement_locked_variable
*copyc osp$fetch_locked_variable
*copyc osp$increment_locked_variable
*copyc osp$system_error
*copyc ost$status
*copyc pmp$delay
?? POP ??
