Exemplo n.º 1
0
    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();
    }
Exemplo n.º 2
0
inline size_t
RingBuffer::Writable() const
{
	return fBuffer != NULL ? ring_buffer_writable(fBuffer) : 0;
}
Exemplo n.º 3
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();
    }
Exemplo n.º 4
0
size_t
RingBuffer::WritableAmount() const
{
	return ring_buffer_writable(fBuffer);
}