[haiku-commits] r35880 - in haiku/trunk: headers/private/kernel/util src/system/kernel/util

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 16 Mar 2010 18:07:40 +0100 (CET)

Author: bonefish
Date: 2010-03-16 18:07:40 +0100 (Tue, 16 Mar 2010)
New Revision: 35880
Changeset: http://dev.haiku-os.org/changeset/35880/haiku

Modified:
   haiku/trunk/headers/private/kernel/util/ring_buffer.h
   haiku/trunk/src/system/kernel/util/ring_buffer.cpp
Log:
Added ring_buffer_get_vecs() that returns iovecs describing the contents of
the buffer.


Modified: haiku/trunk/headers/private/kernel/util/ring_buffer.h
===================================================================
--- haiku/trunk/headers/private/kernel/util/ring_buffer.h       2010-03-16 
16:02:53 UTC (rev 35879)
+++ haiku/trunk/headers/private/kernel/util/ring_buffer.h       2010-03-16 
17:07:40 UTC (rev 35880)
@@ -9,6 +9,9 @@
 #include <OS.h>
 
 
+struct iovec;
+
+
 struct ring_buffer {
        int32           first;
        int32           in;
@@ -40,6 +43,7 @@
 ssize_t ring_buffer_user_write(struct ring_buffer *buffer, const uint8 *data, 
ssize_t length);
 size_t ring_buffer_peek(struct ring_buffer *buffer, size_t offset, void *data,
                        size_t length);
+int32 ring_buffer_get_vecs(struct ring_buffer *buffer, struct iovec *vecs);
 
 #ifdef __cplusplus
 }

Modified: haiku/trunk/src/system/kernel/util/ring_buffer.cpp
===================================================================
--- haiku/trunk/src/system/kernel/util/ring_buffer.cpp  2010-03-16 16:02:53 UTC 
(rev 35879)
+++ haiku/trunk/src/system/kernel/util/ring_buffer.cpp  2010-03-16 17:07:40 UTC 
(rev 35880)
@@ -13,6 +13,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <sys/uio.h>
 
 #ifndef HAIKU_TARGET_PLATFORM_HAIKU
 #define user_memcpy(x...) (memcpy(x), B_OK)
@@ -267,6 +268,40 @@
 }
 
 
+/*!    Returns iovecs describing the contents of the ring buffer.
+
+       \param buffer The ring buffer.
+       \param vecs Pointer to an iovec array with at least 2 elements to be 
filled
+               in by the function.
+       \return The number of iovecs the function has filled in to describe the
+               contents of the ring buffer. \c 0, if empty, \c 2 at maximum.
+*/
+int32
+ring_buffer_get_vecs(struct ring_buffer* buffer, struct iovec* vecs)
+{
+       if (buffer->in == 0)
+               return 0;
+
+       if (buffer->first + buffer->in <= buffer->size) {
+               // one element
+               vecs[0].iov_base = buffer->buffer + buffer->first;
+               vecs[0].iov_len = buffer->in;
+               return 1;
+       }
+
+       // two elements
+       size_t upper = buffer->size - buffer->first;
+       size_t lower = buffer->in - upper;
+
+       vecs[0].iov_base = buffer->buffer + buffer->first;
+       vecs[0].iov_len = upper;
+       vecs[1].iov_base = buffer->buffer;
+       vecs[1].iov_len = lower;
+
+       return 2;
+}
+
+
 #if 0
 /**    Sends the contents of the ring buffer to a port.
  *     The buffer will be empty afterwards only if sending the data actually 
works.


Other related posts:

  • » [haiku-commits] r35880 - in haiku/trunk: headers/private/kernel/util src/system/kernel/util - ingo_weinhold