Lines Matching refs:buffer

32 space_left_in_buffer(struct ring_buffer *buffer)
34 return buffer->size - buffer->in;
39 read_from_buffer(struct ring_buffer *buffer, uint8 *data, ssize_t length,
42 int32 available = buffer->in;
52 if (buffer->first + length <= buffer->size) {
55 if (user_memcpy(data, buffer->buffer + buffer->first, length) < B_OK)
58 memcpy(data, buffer->buffer + buffer->first, length);
61 size_t upper = buffer->size - buffer->first;
65 if (user_memcpy(data, buffer->buffer + buffer->first, upper) < B_OK
66 || user_memcpy(data + upper, buffer->buffer, lower) < B_OK)
69 memcpy(data, buffer->buffer + buffer->first, upper);
70 memcpy(data + upper, buffer->buffer, lower);
74 buffer->first = (buffer->first + bytesRead) % buffer->size;
75 buffer->in -= bytesRead;
82 write_to_buffer(struct ring_buffer *buffer, const uint8 *data, ssize_t length,
85 int32 left = space_left_in_buffer(buffer);
93 int32 position = (buffer->first + buffer->in) % buffer->size;
95 if (position + length <= buffer->size) {
98 if (user_memcpy(buffer->buffer + position, data, length) < B_OK)
101 memcpy(buffer->buffer + position, data, length);
104 size_t upper = buffer->size - position;
108 if (user_memcpy(buffer->buffer + position, data, upper) < B_OK
109 || user_memcpy(buffer->buffer, data + upper, lower) < B_OK)
112 memcpy(buffer->buffer + position, data, upper);
113 memcpy(buffer->buffer, data + upper, lower);
117 buffer->in += bytesWritten;
137 ring_buffer* buffer = (ring_buffer*)malloc(sizeof(ring_buffer) + size);
138 if (buffer == NULL)
141 buffer->size = size;
142 ring_buffer_clear(buffer);
144 return buffer;
148 ring_buffer* buffer = (ring_buffer*)memory;
150 buffer->size = size;
152 && (size_t)buffer->size == size
153 && buffer->in >= 0 && (size_t)buffer->in <= size
154 && buffer->first >= 0 && (size_t)buffer->first < size) {
157 ring_buffer_clear(buffer);
159 return buffer;
164 delete_ring_buffer(struct ring_buffer *buffer)
166 free(buffer);
171 ring_buffer_clear(struct ring_buffer *buffer)
173 buffer->in = 0;
174 buffer->first = 0;
179 ring_buffer_readable(struct ring_buffer *buffer)
181 return buffer->in;
186 ring_buffer_writable(struct ring_buffer *buffer)
188 return buffer->size - buffer->in;
193 ring_buffer_flush(struct ring_buffer *buffer, size_t length)
196 if (length > (size_t)buffer->in)
197 length = buffer->in;
199 buffer->in -= length;
200 buffer->first = (buffer->first + length) % buffer->size;
205 ring_buffer_read(struct ring_buffer *buffer, uint8 *data, ssize_t length)
207 return read_from_buffer(buffer, data, length, false);
212 ring_buffer_write(struct ring_buffer *buffer, const uint8 *data, ssize_t length)
214 return write_to_buffer(buffer, data, length, false);
219 ring_buffer_user_read(struct ring_buffer *buffer, uint8 *data, ssize_t length)
221 return read_from_buffer(buffer, data, length, true);
226 ring_buffer_user_write(struct ring_buffer *buffer, const uint8 *data, ssize_t length)
228 return write_to_buffer(buffer, data, length, true);
232 /*! Reads data from the ring buffer, but doesn't remove the data from it.
233 \param buffer The ring buffer.
235 buffer at which to start reading.
236 \param data The buffer to which to copy the data.
238 \return The number of bytes actually read from the buffer.
241 ring_buffer_peek(struct ring_buffer* buffer, size_t offset, void* data,
244 size_t available = buffer->in;
252 if ((offset += buffer->first) >= (size_t)buffer->size)
253 offset -= buffer->size;
255 if (offset + length <= (size_t)buffer->size) {
257 memcpy(data, buffer->buffer + offset, length);
260 size_t upper = buffer->size - offset;
263 memcpy(data, buffer->buffer + offset, upper);
264 memcpy((uint8*)data + upper, buffer->buffer, lower);
271 /*! Returns iovecs describing the contents of the ring buffer.
273 \param buffer The ring buffer.
277 contents of the ring buffer. \c 0, if empty, \c 2 at maximum.
280 ring_buffer_get_vecs(struct ring_buffer* buffer, struct iovec* vecs)
282 if (buffer->in == 0)
285 if (buffer->first + buffer->in <= buffer->size) {
287 vecs[0].iov_base = buffer->buffer + buffer->first;
288 vecs[0].iov_len = buffer->in;
293 size_t upper = buffer->size - buffer->first;
294 size_t lower = buffer->in - upper;
296 vecs[0].iov_base = buffer->buffer + buffer->first;
298 vecs[1].iov_base = buffer->buffer;
305 /*! Moves data from one ring buffer to another.
307 \param to The destination ring buffer.
309 \param from The source ring buffer.
326 bytesMoved = ring_buffer_write(to, from->buffer + from->first, length);
332 bytesMoved = ring_buffer_write(to, from->buffer + from->first, upper);
335 bytesMoved += ring_buffer_write(to, from->buffer, lower);
347 /** Sends the contents of the ring buffer to a port.
348 * The buffer will be empty afterwards only if sending the data actually works.
352 ring_buffer_write_to_port(struct ring_buffer *buffer, port_id port, int32 code,
355 int32 length = buffer->in;
361 if (buffer->first + length <= buffer->size) {
363 status = write_port_etc(port, code, buffer->buffer + buffer->first, length,
367 size_t upper = buffer->size - buffer->first;
371 vecs[0].iov_base = buffer->buffer + buffer->first;
373 vecs[1].iov_base = buffer->buffer;
382 buffer->first = (buffer->first + length) % buffer->size;
383 buffer->in -= length;