From: Wouter Wijngaards Date: Fri, 4 May 2007 13:01:20 +0000 (+0000) Subject: Send tcp buffers using writev. X-Git-Tag: release-0.3~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d4d4ba78e02a2671d3b4c7df99ffe1987db11ccd;p=thirdparty%2Funbound.git Send tcp buffers using writev. git-svn-id: file:///svn/unbound/trunk@284 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/doc/Changelog b/doc/Changelog index 5aec95598..a5f2e4dc3 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -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. diff --git a/util/netevent.c b/util/netevent.c index a65ff4ab1..c80f42f68 100644 --- a/util/netevent.c +++ b/util/netevent.c @@ -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);