summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbustico2009-07-06 10:22:07 +0000
committerbustico2009-07-06 10:22:07 +0000
commitc11ddf39df8c9ea9e08410277b3a476961ad1df2 (patch)
tree7191b170cf58b0546b08025a9d1b1ba6040c3017 /src
parent41ab25636882f12eed1c31a818a70aed12a46bbf (diff)
downloadivy-c-c11ddf39df8c9ea9e08410277b3a476961ad1df2.zip
ivy-c-c11ddf39df8c9ea9e08410277b3a476961ad1df2.tar.gz
ivy-c-c11ddf39df8c9ea9e08410277b3a476961ad1df2.tar.bz2
ivy-c-c11ddf39df8c9ea9e08410277b3a476961ad1df2.tar.xz
force tcp_no_delay option to reduce lag on small messages
Diffstat (limited to 'src')
-rw-r--r--src/Makefile14
-rw-r--r--src/ivysocket.c30
-rw-r--r--src/param.c3
-rw-r--r--src/param.h16
4 files changed, 55 insertions, 8 deletions
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 <omp.h>
#endif
@@ -27,6 +29,7 @@
#include <stdarg.h>
#include <string.h>
#include <fcntl.h>
+#include <netinet/tcp.h>
#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