int enqueue()

in src/cubeb_ringbuffer.h [107:139]


  int enqueue(T * elements, int count)
  {
#ifndef NDEBUG
    assert_correct_thread(producer_id);
#endif

    int wr_idx = write_index_.load(std::memory_order_relaxed);
    int rd_idx = read_index_.load(std::memory_order_acquire);

    if (full_internal(rd_idx, wr_idx)) {
      return 0;
    }

    int to_write = std::min(available_write_internal(rd_idx, wr_idx), count);

    /* First part, from the write index to the end of the array. */
    int first_part = std::min(storage_capacity() - wr_idx, to_write);
    /* Second part, from the beginning of the array */
    int second_part = to_write - first_part;

    if (elements) {
      Copy(data_.get() + wr_idx, elements, first_part);
      Copy(data_.get(), elements + first_part, second_part);
    } else {
      ConstructDefault(data_.get() + wr_idx, first_part);
      ConstructDefault(data_.get(), second_part);
    }

    write_index_.store(increment_index(wr_idx, to_write),
                       std::memory_order_release);

    return to_write;
  }