void read(void* data, size_t length) throw (ring_buffer_concurrency_error_exception, ring_buffer_underflow_exception, ring_buffer_invalid_address_exception) { if (0 != data) { lock_guard lock(this); if (ring_buffer_readable() >= length) { size_t left = length; do { size_t target = _read % capacity, size = std::min(left, capacity - target); memcpy(reinterpret_cast<char*>(data) + length - left, reinterpret_cast<const char*>(buffer) + target, size); left -= size; _read += size; } while (left > 0); if (write_callback.callback and (ring_buffer_writable() >= write_callback.threshold)) write_callback.callback(parent); } else throw ring_buffer_underflow_exception(); } else throw ring_buffer_invalid_address_exception(); }
inline size_t RingBuffer::Writable() const { return fBuffer != NULL ? ring_buffer_writable(fBuffer) : 0; }
void get_available(size_t& read, size_t& write) throw (ring_buffer_concurrency_error_exception) { lock_guard lock(this); read = ring_buffer_readable(); write = ring_buffer_writable(); }
size_t RingBuffer::WritableAmount() const { return ring_buffer_writable(fBuffer); }