]> granicus.if.org Git - libevent/commitdiff
Use the native "struct iovec" as our "struct evbuffer_iovec" when available, so we...
authorNick Mathewson <nickm@torproject.org>
Thu, 21 May 2009 20:59:00 +0000 (20:59 +0000)
committerNick Mathewson <nickm@torproject.org>
Thu, 21 May 2009 20:59:00 +0000 (20:59 +0000)
svn:r1299

buffer.c
buffer_iocp.c
evbuffer-internal.h
include/event2/buffer.h

index 647a7563bf86b2143793073d5f425f477304ea8f..9cadf89dce573f8f3bcf67ae80fa59122e203930 100644 (file)
--- a/buffer.c
+++ b/buffer.c
@@ -1475,17 +1475,10 @@ _evbuffer_expand_fast(struct evbuffer *buf, size_t datlen)
 #define IOV_PTR_FIELD buf
 #define IOV_LEN_FIELD len
 #endif
-
-#define IOV_TYPE_FROM_EVBUFFER_IOV(i,ei) do {          \
-               (i)->IOV_PTR_FIELD = (ei)->iov_base;    \
-               (i)->IOV_LEN_FIELD = (ei)->iov_len;     \
-       } while(0)
-
 #endif
 
 #define EVBUFFER_MAX_READ      4096
 
-#ifdef USE_IOVEC_IMPL
 /** Helper function to figure out which space to use for reading data into
     an evbuffer.  Internal use only.
 
@@ -1494,7 +1487,8 @@ _evbuffer_expand_fast(struct evbuffer *buf, size_t datlen)
     @param vecs An array of two iovecs or WSABUFs.
     @param chainp A pointer to a variable to hold the first chain we're
       reading into.
-    @param exact DOCDOC
+    @param exact Boolean: if true, we do not provide more than 'howmuch'
+      space in the vectors, even if more space is available.
     @return The number of buffers we're using.
  */
 int
@@ -1546,7 +1540,6 @@ _evbuffer_read_setup_vecs(struct evbuffer *buf, ssize_t howmuch,
        *chainp = chain;
        return nvecs;
 }
-#endif
 
 /* TODO(niels): should this function return ssize_t and take ssize_t
  * as howmuch? */
@@ -1605,16 +1598,23 @@ evbuffer_read(struct evbuffer *buf, evutil_socket_t fd, int howmuch)
                 goto done;
        } else {
                IOV_TYPE vecs[2];
+#ifdef _EVBUFFER_IOVEC_IS_NATIVE
+               nvecs = _evbuffer_read_setup_vecs(buf, howmuch, vecs,
+                   &chain, 1);
+#else
+               /* We aren't using the native struct iovec.  Therefore,
+                  we are on win32. */
                struct evbuffer_iovec ev_vecs[2];
                nvecs = _evbuffer_read_setup_vecs(buf, howmuch, ev_vecs,
                    &chain, 1);
 
                if (nvecs == 2) {
-                       IOV_TYPE_FROM_EVBUFFER_IOV(&vecs[1], &ev_vecs[1]);
-                       IOV_TYPE_FROM_EVBUFFER_IOV(&vecs[0], &ev_vecs[0]);
+                       WSABUF_FROM_EVBUFFER_IOV(&vecs[1], &ev_vecs[1]);
+                       WSABUF_FROM_EVBUFFER_IOV(&vecs[0], &ev_vecs[0]);
                } else if (nvecs == 1) {
-                       IOV_TYPE_FROM_EVBUFFER_IOV(&vecs[0], &ev_vecs[0]);
+                       WSABUF_FROM_EVBUFFER_IOV(&vecs[0], &ev_vecs[0]);
                }
+#endif
 
 #ifdef WIN32
                {
index 04b5c40bedca78837ba6672955573b7f45f5b418..3c7e6e9bdbc25e9855fb78d4bfaaaa3c7a623578 100644 (file)
@@ -245,11 +245,6 @@ done:
        return r;
 }
 
-#define IOV_TYPE_FROM_EVBUFFER_IOV(i,ei) do {          \
-               (i)->buf = (ei)->iov_base;              \
-               (i)->len = (ei)->iov_len;               \
-       } while(0)
-
 int
 evbuffer_launch_read(struct evbuffer *buf, size_t at_most)
 {
@@ -280,7 +275,7 @@ evbuffer_launch_read(struct evbuffer *buf, size_t at_most)
        nvecs = _evbuffer_read_setup_vecs(buf, at_most,
            vecs, &chain, 1);
        for (i=0;i<nvecs;++i) {
-               IOV_TYPE_FROM_EVBUFFER_IOV(
+               WSABUF_FROM_EVBUFFER_IOV(
                        &buf_o->read_info.buffers[i],
                        &vecs[i]);
        }
index 835745d23c323865a5ea86fac61fa2cac2f2d824..10263cbea6c1bf75e5cb75493738dbde076864e2 100644 (file)
@@ -252,6 +252,7 @@ void _evbuffer_chain_unpin(struct evbuffer_chain *chain, unsigned flag);
 /** As evbuffer_free, but requires that we hold a lock on the buffer, and
  * releases the lock before freeing it and the buffer. */
 void _evbuffer_decref_and_unlock(struct evbuffer *buffer);
+
 /** As evbuffer_expand, but does not guarantee that the newly allocated memory
  * is contiguous.  Instead, it may be split across two chunks. */
 int _evbuffer_expand_fast(struct evbuffer *, size_t);
@@ -265,6 +266,12 @@ int _evbuffer_expand_fast(struct evbuffer *, size_t);
 int _evbuffer_read_setup_vecs(struct evbuffer *buf, ssize_t howmuch,
     struct evbuffer_iovec *vecs, struct evbuffer_chain **chainp, int exact);
 
+/* Helper macro: copies an evbuffer_iovec in ei to a win32 WSABUF in i. */
+#define WSABUF_FROM_EVBUFFER_IOV(i,ei) do {            \
+               (i)->buf = (ei)->iov_base;              \
+               (i)->len = (ei)->iov_len;               \
+       } while(0)
+
 #ifdef __cplusplus
 }
 #endif
index 0cbe8258cf8b4ab7bf78c2a79c86a2b6b2fd43e7..e9c834902af453b0fc56a0aa745fd524c808a86c 100644 (file)
@@ -70,6 +70,9 @@ extern "C" {
 #ifdef _EVENT_HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
+#ifdef _EVENT_HAVE_SYS_UIO_H
+#include <sys/uio.h>
+#endif
 #include <event2/util.h>
 
 struct evbuffer;
@@ -94,12 +97,18 @@ struct evbuffer_ptr {
 
     @see evbuffer_reserve_space, evbuffer_commit_space, evbuffer_peek
  */
+#ifdef _EVENT_HAVE_SYS_UIO_H
+#define evbuffer_iovec iovec
+/* Internal use -- defined only if we are using the native struct iovec */
+#define _EVBUFFER_IOVEC_IS_NATIVE
+#else
 struct evbuffer_iovec {
        /** The start of the extent of memory. */
        void *iov_base;
        /** The length of the extent of memory. */
        size_t iov_len;
 };
+#endif
 
 /**
   Allocate storage for a new evbuffer.