From c11ddf39df8c9ea9e08410277b3a476961ad1df2 Mon Sep 17 00:00:00 2001 From: bustico Date: Mon, 6 Jul 2009 10:22:07 +0000 Subject: force tcp_no_delay option to reduce lag on small messages --- src/Makefile | 14 +++++++------- src/ivysocket.c | 30 ++++++++++++++++++++++++++++++ src/param.c | 3 +++ src/param.h | 16 +++++++++++++++- 4 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 src/param.c (limited to 'src') diff --git a/src/Makefile b/src/Makefile index b128233..1459506 100644 --- a/src/Makefile +++ b/src/Makefile @@ -114,13 +114,13 @@ BUGGY_DEBIAN_OPTION = -DPCRECPP_EXP_DEFN="" -DPCRECPP_EXP_DECL="" OMPCFLAGS = $(CFLAGS) -fopenmp -DOPENMP=1 OMPLIB = -lgomp -lpthread -OBJ = ivyloop.o timer.o ivysocket.o ivy.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o -OMPOBJ = ivyloop.o timer.o ivysocket_omp.o ivy_omp.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o -GOBJ = ivyloop.o timer.o ivysocket.o givy.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o -XTOBJ = ivyxtloop.o ivysocket.o ivy.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o -GLIBOBJ = ivyglibloop.o ivysocket.o ivy.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o -GLUTOBJ = ivyglutloop.o ivysocket.o ivy.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o -TCLOBJ = ivytcl.o timer.o ivysocket.o givy.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o +OBJ = ivyloop.o timer.o ivysocket.o ivy.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o param.o +OMPOBJ = ivyloop.o timer.o ivysocket_omp.o ivy_omp.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o param.o +GOBJ = ivyloop.o timer.o ivysocket.o givy.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o param.o +XTOBJ = ivyxtloop.o ivysocket.o ivy.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o param.o +GLIBOBJ = ivyglibloop.o ivysocket.o ivy.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o param.o +GLUTOBJ = ivyglutloop.o ivysocket.o ivy.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o param.o +TCLOBJ = ivytcl.o timer.o ivysocket.o givy.o ivybuffer.o ivyfifo.o ivybind.o intervalRegexp.o param.o # WINDOWS add ivyloop.o if TCL_CHANNEL_INTEGRATION is not set TARGETLIBS=libivy.so.$(MAJOR).$(MINOR) libgivy.so.$(MAJOR).$(MINOR) libxtivy.so.$(MAJOR).$(MINOR) libglibivy.so.$(MAJOR).$(MINOR) libtclivy.so.$(MAJOR).$(MINOR) diff --git a/src/ivysocket.c b/src/ivysocket.c index 200074e..09fe251 100644 --- a/src/ivysocket.c +++ b/src/ivysocket.c @@ -14,6 +14,8 @@ * copyright notice regarding this software */ + + #ifdef OPENMP #include #endif @@ -27,6 +29,7 @@ #include #include #include +#include #ifdef WIN32 #ifndef __MINGW32__ @@ -265,6 +268,19 @@ static void HandleServer(Channel channel, HANDLE fd, void *data) fprintf(stderr,"Warning : Setting socket in nonblock mode FAILED\n"); } #endif + if (setsockopt(client->fd, /* socket affected */ + IPPROTO_TCP, /* set option at TCP level */ + TCP_NODELAY, /* name of option */ + (char *) &_TCP_NO_DELAY_ACTIVATED, /* the cast is historical */ + sizeof(_TCP_NO_DELAY_ACTIVATED)) < 0) /* length of option value */ + { +#ifdef WIN32 + fprintf(stderr," setsockopt %d\n",WSAGetLastError()); +#endif + perror ("*** set socket option TCP_NODELAY***"); + exit(0); + } + @@ -656,6 +672,20 @@ Client SocketConnectAddr (struct in_addr * addr, unsigned short port, fprintf(stderr,"Warning : Setting socket in nonblock mode FAILED\n"); } #endif + if (setsockopt(handle, /* socket affected */ + IPPROTO_TCP, /* set option at TCP level */ + TCP_NODELAY, /* name of option */ + (char *) &_TCP_NO_DELAY_ACTIVATED, /* the cast is historical */ + sizeof(_TCP_NO_DELAY_ACTIVATED)) < 0) /* length of option value */ + { +#ifdef WIN32 + fprintf(stderr," setsockopt %d\n",WSAGetLastError()); +#endif + perror ("*** set socket option TCP_NODELAY***"); + exit(0); + } + + IVY_LIST_ADD_START(clients_list, client ); client->buffer_size = IVY_BUFFER_SIZE; diff --git a/src/param.c b/src/param.c new file mode 100644 index 0000000..8a6bd49 --- /dev/null +++ b/src/param.c @@ -0,0 +1,3 @@ +#include "param.h" + +const int _TCP_NO_DELAY_ACTIVATED = 1; diff --git a/src/param.h b/src/param.h index 85b0542..3e482b3 100644 --- a/src/param.h +++ b/src/param.h @@ -53,6 +53,20 @@ /* maximum number of arguments which can be catched by a regexp */ -#define MAX_MATCHING_ARGS 40 +#define MAX_MATCHING_ARGS 120 + + +/* TCP_NODELAY is for a specific purpose; to disable the Nagle buffering + algorithm. It should only be set for applications that send frequent + small bursts of information without getting an immediate response, + where timely delivery of data is required (the canonical example is + mouse movements). + + Since Ivy is most of the time used to send events, we will priviligiate + lag over throughtput, so _TCP_NO_DELAY_ACTIVATED is set to 1 +*/ +extern const int _TCP_NO_DELAY_ACTIVATED; + + #endif // PARAM_H -- cgit v1.1