THRIFT-904: disable nagle and linger

git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1063966 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/configure.ac b/configure.ac
index b1ab0a7..6f18c0e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,7 +17,7 @@
 # under the License.
 #
 
-AC_PREREQ(2.65)
+#AC_PREREQ(2.65)
 
 AC_INIT([thrift], [0.7.0-dev])
 
diff --git a/lib/csharp/src/Transport/TFramedTransport.cs b/lib/csharp/src/Transport/TFramedTransport.cs
index b7ad5f2..e259f5a 100644
--- a/lib/csharp/src/Transport/TFramedTransport.cs
+++ b/lib/csharp/src/Transport/TFramedTransport.cs
@@ -24,9 +24,12 @@
 	public class TFramedTransport : TTransport
 	{
 		protected TTransport transport = null;
-		protected MemoryStream writeBuffer = new MemoryStream(1024);
+		protected MemoryStream writeBuffer;
 		protected MemoryStream readBuffer = null;
 
+		private const int header_size = 4;
+		private static byte[] header_dummy = new byte[header_size]; // used as header placeholder while initilizing new write buffer
+
 		public class Factory : TTransportFactory
 		{
 			public override TTransport GetTransport(TTransport trans)
@@ -35,7 +38,12 @@
 			}
 		}
 
-		public TFramedTransport(TTransport transport)
+		public TFramedTransport()
+		{
+			InitWriteBuffer();
+		}
+
+		public TFramedTransport(TTransport transport) : this()
 		{
 			this.transport = transport;
 		}
@@ -77,8 +85,8 @@
 
 		private void ReadFrame()
 		{
-			byte[] i32rd = new byte[4];
-			transport.ReadAll(i32rd, 0, 4);
+			byte[] i32rd = new byte[header_size];
+			transport.ReadAll(i32rd, 0, header_size);
 			int size =
 				((i32rd[0] & 0xff) << 24) |
 				((i32rd[1] & 0xff) << 16) |
@@ -99,16 +107,31 @@
 		{
 			byte[] buf = writeBuffer.GetBuffer();
 			int len = (int)writeBuffer.Length;
-			writeBuffer = new MemoryStream(writeBuffer.Capacity);
+			int data_len = len - header_size;
+			if ( data_len < 0 )
+				throw new System.InvalidOperationException (); // logic error actually
 
-			byte[] i32out = new byte[4];
-			i32out[0] = (byte)(0xff & (len >> 24));
-			i32out[1] = (byte)(0xff & (len >> 16));
-			i32out[2] = (byte)(0xff & (len >> 8));
-			i32out[3] = (byte)(0xff & (len));
-			transport.Write(i32out, 0, 4);
+			InitWriteBuffer();
+
+			// Inject message header into the reserved buffer space
+			buf[0] = (byte)(0xff & (data_len >> 24));
+			buf[1] = (byte)(0xff & (data_len >> 16));
+			buf[2] = (byte)(0xff & (data_len >> 8));
+			buf[3] = (byte)(0xff & (data_len));
+
+			// Send the entire message at once
 			transport.Write(buf, 0, len);
+
 			transport.Flush();
 		}
+
+		private void InitWriteBuffer ()
+		{
+			// Create new buffer instance
+			writeBuffer = new MemoryStream(1024);
+
+			// Reserve space for message header to be put right before sending it out
+			writeBuffer.Write ( header_dummy, 0, header_size );
+		}
 	}
 }
diff --git a/test/csharp/ThriftTest/TestClient.cs b/test/csharp/ThriftTest/TestClient.cs
index 1d7c75e..60fc995 100644
--- a/test/csharp/ThriftTest/TestClient.cs
+++ b/test/csharp/ThriftTest/TestClient.cs
@@ -39,7 +39,7 @@
 				int port = 9090;
 				string url = null;
 				int numThreads = 1;
-				bool buffered = false;
+				bool buffered = false, framed = false;
 
 				try
 				{
@@ -67,6 +67,11 @@
 							buffered = true;
 							Console.WriteLine("Using buffered sockets");
 						}
+						else if (args[i] == "-f" || args[i] == "-framed")
+						{
+							framed = true;
+							Console.WriteLine("Using framed transport");
+						}
 						else if (args[i] == "-t")
 						{
 							numThreads = Convert.ToInt32(args[++i]);
@@ -89,16 +94,13 @@
 					threads[test] = t;
 					if (url == null)
 					{
-						TSocket socket = new TSocket(host, port);
+						TTransport trans = new TSocket(host, port);
 						if (buffered)
-						{
-							TBufferedTransport buffer = new TBufferedTransport(socket);
-							t.Start(buffer);
-						}
-						else
-						{
-							t.Start(socket);
-						}
+							trans = new TBufferedTransport(trans as TStreamTransport);
+						if (framed)
+							trans = new TFramedTransport(trans);
+							
+						t.Start(trans);
 					}
 					else
 					{
@@ -428,6 +430,12 @@
 
 			Console.WriteLine("Test Oneway(1)");
 			client.testOneway(1);
+
+			Console.Write("Test Calltime()");
+			var startt = DateTime.UtcNow;
+			for ( int k=0; k<1000; ++k )
+				client.testVoid();
+			Console.WriteLine(" = " + (DateTime.UtcNow - startt).TotalSeconds.ToString() + " ms a testVoid() call" );
 		}
 	}
 }
diff --git a/test/csharp/ThriftTest/TestServer.cs b/test/csharp/ThriftTest/TestServer.cs
index e370640..894ec9c 100644
--- a/test/csharp/ThriftTest/TestServer.cs
+++ b/test/csharp/ThriftTest/TestServer.cs
@@ -301,7 +301,7 @@
 		{
 			try
 			{
-				bool useBufferedSockets = false;
+				bool useBufferedSockets = false, useFramed = false;
 				int port = 9090;
 				if (args.Length > 0)
 				{
@@ -309,7 +309,23 @@
 
 					if (args.Length > 1)
 					{
-						bool.TryParse(args[1], out useBufferedSockets);
+						if ( args[1] == "raw" )
+						{
+							// as default
+						}
+						else if ( args[1] == "buffered" )
+						{
+							useBufferedSockets = true;
+						}
+						else if ( args[1] == "framed" )
+						{
+							useFramed = true;
+						}
+						else
+						{
+							// Fall back to the older boolean syntax
+							bool.TryParse(args[1], out useBufferedSockets);
+						}
 					}
 				}
 
@@ -320,10 +336,12 @@
 				// Transport
 				TServerSocket tServerSocket = new TServerSocket(port, 0, useBufferedSockets);
 
-				TServer serverEngine;
-
 				// Simple Server
-				serverEngine = new TSimpleServer(testProcessor, tServerSocket);
+				TServer serverEngine;
+				if ( useFramed )
+					serverEngine = new TSimpleServer(testProcessor, tServerSocket, new TFramedTransport.Factory());
+				else
+					serverEngine = new TSimpleServer(testProcessor, tServerSocket);
 
 				// ThreadPool Server
 				// serverEngine = new TThreadPoolServer(testProcessor, tServerSocket);
@@ -334,7 +352,10 @@
 				testHandler.server = serverEngine;
 
 				// Run it
-				Console.WriteLine("Starting the server on port " + port + (useBufferedSockets ? " with buffered socket" : "") + "...");
+				Console.WriteLine("Starting the server on port " + port + 
+					(useBufferedSockets ? " with buffered socket" : "") + 
+					(useFramed ? " with framed transport" : "") + 
+					"...");
 				serverEngine.Serve();
 
 			}