summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Antonuk <alan.antonuk@gmail.com>2015-05-25 22:12:56 -0700
committerAlan Antonuk <alan.antonuk@gmail.com>2015-05-25 22:12:56 -0700
commit1b522337486cfd57ce52654b8c7e834e42d2d4ae (patch)
tree27dd3b33662406a48a102d039c35e902a3863078
parentf9811a868610898e54d01b042b30caf54f2e05e8 (diff)
downloadrabbitmq-c-send_perf.tar.gz
Use TCP_NOPUSH on Mac OS X/*BSD.send_perf
-rw-r--r--librabbitmq/amqp_tcp_socket.c21
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: