]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Send tcp buffers using writev.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 4 May 2007 13:01:20 +0000 (13:01 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 4 May 2007 13:01:20 +0000 (13:01 +0000)
git-svn-id: file:///svn/unbound/trunk@284 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
util/netevent.c

index 5aec95598093f8bf3ce608e168944be35643130b..a5f2e4dc394452a512bdebc17006d92767ad66e2 100644 (file)
@@ -6,6 +6,8 @@
        - alloc cache special_release() locks if necessary.
        - rrset trustworthiness type added.
        - thread keeps a scratchpad region for handling messages.
+       - writev used in netevent to write tcp length and data after another.
+         This saves a roundtrip on tcp replies.
 
 3 May 2007: Wouter
        - fill refs. Use new parse and encode to answer queries.
index a65ff4ab1f1d527c16d4df21fba43894adbba886..c80f42f6874999b5159464bb65a89f01e4b77fa9 100644 (file)
@@ -436,30 +436,34 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
 
        if(c->tcp_byte_count < sizeof(uint16_t)) {
                uint16_t len = htons(ldns_buffer_limit(c->buffer));
-               /*
                struct iovec iov[2];
                iov[0].iov_base = (uint8_t*)&len + c->tcp_byte_count;
                iov[0].iov_len = sizeof(uint16_t) - c->tcp_byte_count;
-               */
-               r = write(fd, (uint8_t*)&len + c->tcp_byte_count, 
-                       sizeof(uint16_t) - c->tcp_byte_count);
+               iov[1].iov_base = ldns_buffer_begin(c->buffer);
+               iov[1].iov_len = ldns_buffer_limit(c->buffer);
+               r = writev(fd, iov, 2);
                if(r == -1) {
                        if(errno == EINTR || errno == EAGAIN)
                                return 1;
-                       log_err("tcp write(s): %s", strerror(errno));
+                       log_err("tcp writev: %s", strerror(errno));
                        return 0;
                }
                c->tcp_byte_count += r;
-               if(c->tcp_byte_count != sizeof(uint16_t))
+               if(c->tcp_byte_count < sizeof(uint16_t))
                        return 1;
-               ldns_buffer_set_position(c->buffer, 0);
+               ldns_buffer_set_position(c->buffer, c->tcp_byte_count - 
+                       sizeof(uint16_t));
+               if(ldns_buffer_remaining(c->buffer) == 0) {
+                       tcp_callback_writer(c);
+               }
+               return 1;
        }
        r = write(fd, ldns_buffer_current(c->buffer), 
                ldns_buffer_remaining(c->buffer));
        if(r == -1) {
                if(errno == EINTR || errno == EAGAIN)
                        return 1;
-               log_err("tcp write(w): %s", strerror(errno));
+               log_err("tcp write: %s", strerror(errno));
                return 0;
        }
        ldns_buffer_skip(c->buffer, r);