diff options
author | Alan Antonuk <alan.antonuk@gmail.com> | 2015-05-25 22:12:56 -0700 |
---|---|---|
committer | Alan Antonuk <alan.antonuk@gmail.com> | 2015-05-25 22:12:56 -0700 |
commit | 1b522337486cfd57ce52654b8c7e834e42d2d4ae (patch) | |
tree | 27dd3b33662406a48a102d039c35e902a3863078 | |
parent | f9811a868610898e54d01b042b30caf54f2e05e8 (diff) | |
download | rabbitmq-c-send_perf.tar.gz |
Use TCP_NOPUSH on Mac OS X/*BSD.send_perf
-rw-r--r-- | librabbitmq/amqp_tcp_socket.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/librabbitmq/amqp_tcp_socket.c b/librabbitmq/amqp_tcp_socket.c index e363b90..20e2bbd 100644 --- a/librabbitmq/amqp_tcp_socket.c +++ b/librabbitmq/amqp_tcp_socket.c @@ -29,6 +29,7 @@ #include "amqp_tcp_socket.h" #include <errno.h> +#include <netinet/tcp.h> #include <stdio.h> #include <stdlib.h> @@ -38,6 +39,7 @@ struct amqp_tcp_socket_t { void *buffer; size_t buffer_length; int internal_error; + int state; }; @@ -60,6 +62,25 @@ amqp_tcp_socket_send(void *base, const void *buf, size_t len, int flags) if (flags & AMQP_SF_MORE) { flagz |= MSG_MORE; } +#elif defined(TCP_NOPUSH) + if (flags & AMQP_SF_MORE && !(self->state & AMQP_SF_MORE)) { + int one = 1; + res = setsockopt(self->sockfd, IPPROTO_TCP, TCP_NOPUSH, &one, sizeof(one)); + if (0 != res) { + self->internal_error = res; + return AMQP_STATUS_SOCKET_ERROR; + } + self->state |= AMQP_SF_MORE; + } else if (!(flags & AMQP_SF_MORE) && self->state & AMQP_SF_MORE) { + int zero = 0; + res = setsockopt(self->sockfd, IPPROTO_TCP, TCP_NOPUSH, &zero, sizeof(&zero)); + if (0 != res) { + self->internal_error = res; + res = AMQP_STATUS_SOCKET_ERROR; + } else { + self->state &= ~AMQP_SF_MORE; + } + } #endif start: |