More boosification of thrift driver, server, transport and protocol code

Modified TestServer to use thread-pool manager 


	


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664738 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/test/cpp/Makefile b/test/cpp/Makefile
index 36abb43..693dbad 100644
--- a/test/cpp/Makefile
+++ b/test/cpp/Makefile
@@ -4,6 +4,10 @@
 #   Mark Slee <mcslee@facebook.com>
 
 # Default target is everything
+
+ifndef thrift_home
+thrift_home=../../build
+endif #thrift_home
 target: all
 
 # Tools
@@ -11,6 +15,8 @@
 CC     = g++
 LD     = g++
 
+include_flags = $(patsubst %,-I$(thrift_home)/include/%, thrift boost-1_33_1)
+
 # Compiler flags
 LIBS  = ../../lib/cpp/src/server/TSimpleServer.cc \
 	../../lib/cpp/src/protocol/TBinaryProtocol.cc \
@@ -18,8 +24,8 @@
 	../../lib/cpp/src/transport/TChunkedTransport.cc \
 	../../lib/cpp/src/transport/TServerSocket.cc \
 	../../lib/cpp/src/transport/TSocket.cc
-DCFL  = -Wall -O3 -g -Igen-cpp -I../../lib/cpp/src $(LIBS)
-CFL   = -Wall -O3 -Igen-cpp -I../../lib/cpp/src -lthrift
+DCFL  = -Wall -O3 -g -Igen-cpp $(include_flags) $(LIBS)
+CFL   = -Wall -O3 -Igen-cpp $(include_flags) -L$(thrift_home)/lib -lthrift
 
 all: server client
 
diff --git a/test/cpp/src/TestClient.cc b/test/cpp/src/TestClient.cc
index 083661f..e977442 100644
--- a/test/cpp/src/TestClient.cc
+++ b/test/cpp/src/TestClient.cc
@@ -1,13 +1,20 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <sys/time.h>
-#include "protocol/TBinaryProtocol.h"
-#include "transport/TBufferedTransport.h"
-#include "transport/TSocket.h"
-#include "ThriftTest.h"
-using namespace std;
+#include <protocol/TBinaryProtocol.h>
+#include <transport/TBufferedTransport.h>
+#include <transport/TSocket.h>
 
-extern uint32_t g_socket_syscalls;
+#include <boost/shared_ptr.hpp>
+#include "ThriftTest.h"
+
+using namespace boost;
+using namespace std;
+using namespace facebook::thrift;
+using namespace facebook::thrift::protocol;
+using namespace facebook::thrift::transport;
+
+//extern uint32_t g_socket_syscalls;
 
 // Current time, microseconds since the epoch
 uint64_t now()
@@ -36,10 +43,10 @@
     numTests = atoi(argv[3]);
   }
 
-  TSocket socket(host, port);
-  TBufferedTransport bufferedSocket(&socket, 2048);
-  TBinaryProtocol binaryProtocol;
-  ThriftTestClient testClient(&bufferedSocket, &binaryProtocol);
+  shared_ptr<TSocket> socket(new TSocket(host, port));
+  shared_ptr<TBufferedTransport> bufferedSocket(new TBufferedTransport(socket, 2048));
+  shared_ptr<TBinaryProtocol> binaryProtocol(new TBinaryProtocol());
+  ThriftTestClient testClient(bufferedSocket, binaryProtocol);
   
   int test = 0;
   for (test = 0; test < numTests; ++test) {
@@ -49,7 +56,7 @@
      */
     printf("Test #%d, connect %s:%d\n", test+1, host.c_str(), port);
     try {
-      bufferedSocket.open();
+      bufferedSocket->open();
     } catch (TTransportException& ttx) {
       printf("Connect failed: %s\n", ttx.getMessage().c_str());
       continue;
@@ -320,10 +327,10 @@
     uint64_t stop = now();
     printf("Total time: %lu us\n", stop-start);
 
-    bufferedSocket.close();
+    bufferedSocket->close();
   }
 
-  printf("\nSocket syscalls: %u", g_socket_syscalls);
+  //  printf("\nSocket syscalls: %u", g_socket_syscalls);
   printf("\nAll tests done.\n");
   return 0;
 }
diff --git a/test/cpp/src/TestServer.cc b/test/cpp/src/TestServer.cc
index c0df233..eb95720 100644
--- a/test/cpp/src/TestServer.cc
+++ b/test/cpp/src/TestServer.cc
@@ -1,13 +1,25 @@
-#include <stdio.h>
-#include "protocol/TBinaryProtocol.h"
-#include "server/TSimpleServer.h"
-#include "transport/TServerSocket.h"
+#include <concurrency/ThreadManager.h>
+#include <concurrency/PosixThreadFactory.h>
+#include <protocol/TBinaryProtocol.h>
+#include <server/TSimpleServer.h>
+#include <server/TThreadPoolServer.h>
+#include <transport/TServerSocket.h>
 #include "ThriftTest.h"
+
+#include <iostream>
+#include <stdexcept>
+#include <sstream>
+
 using namespace std;
 
+using namespace facebook::thrift;
+using namespace facebook::thrift::protocol;
+using namespace facebook::thrift::transport;
+using namespace facebook::thrift::server;
+
 class TestServer : public ThriftTestServerIf {
  public:
-  TestServer(TProtocol* protocol) :
+  TestServer(shared_ptr<TProtocol> protocol) :
     ThriftTestServerIf(protocol) {}
 
   void testVoid() {
@@ -203,32 +215,127 @@
 
     return insane;
   }
-
 };
 
 int main(int argc, char **argv) {
+
   int port = 9090;
-  if (argc > 1) {
-    port = atoi(argv[1]);
+  string serverType = "simple";
+  string protocolType = "binary";
+  size_t workerCount = 4;
+
+  ostringstream usage;
+
+  usage <<
+    argv[0] << " [--port=<port number>] [--server-type=<server-type>] [--protocol-type=<protocol-type>] [--workers=<worker-count>]" << endl <<
+
+    "\t\tserver-type\t\ttype of server, \"simple-server\" or \"thread-pool\".  Default is " << serverType << endl <<
+
+    "\t\tprotocol-type\t\ttype of protocol, \"binary\", \"ascii\", or \"xml\".  Default is " << protocolType << endl <<
+
+    "\t\tworkers\t\tNumber of thread pools workers.  Only valid for thread-pool server type.  Default is " << workerCount << endl;
+    
+  map<string, string>  args;
+  
+  for(int ix = 1; ix < argc; ix++) {
+
+    string arg(argv[ix]);
+
+    if(arg.compare(0,2, "--") == 0) {
+
+      size_t end = arg.find_first_of("=", 2);
+
+      if(end != string::npos) {
+	args[string(arg, 2, end - 2)] = string(arg, end + 1);
+      } else {
+	args[string(arg, 2, end - 2)] = "true";
+      }
+      ix++;
+    } else {
+      throw invalid_argument("Unexcepted command line token: "+arg);
+    }
   }
- 
+
+  try {
+
+    if(!args["port"].empty()) {
+      port = atoi(args["port"].c_str());
+    }
+
+    if(!args["server-type"].empty()) {
+      serverType = args["server-type"];
+      
+      if(serverType == "simple") {
+
+      } else if(serverType == "thread-pool") {
+
+      } else {
+
+	throw invalid_argument("Unknown server type "+serverType);
+      }
+    }
+
+    if(!args["protocol-type"].empty()) {
+      protocolType = args["protocol-type"];
+      
+      if(protocolType == "binary") {
+      } else if(protocolType == "ascii") {
+	throw invalid_argument("ASCII protocol not supported");
+      } else if(protocolType == "xml") {
+	throw invalid_argument("XML protocol not supported");
+      } else {
+	throw invalid_argument("Unknown protocol type "+protocolType);
+      }
+    } 
+
+    if(!args["workers"].empty()) {
+      workerCount = atoi(args["workers"].c_str());
+    }
+  } catch(exception& e) {
+    cerr << e.what() << endl;
+    cerr << usage;
+  }
+
   // Dispatcher
-  TBinaryProtocol binaryProtocol;
-  TestServer testServer(&binaryProtocol);
+  shared_ptr<TBinaryProtocol> binaryProtocol(new TBinaryProtocol);
+
+  shared_ptr<TestServer> testServer(new TestServer(binaryProtocol));
 
   // Options
-  TServerOptions serverOptions;
+  shared_ptr<TServerOptions> serverOptions(new TServerOptions());
 
   // Transport
-  TServerSocket serverSocket(port);
+  shared_ptr<TServerSocket> serverSocket(new TServerSocket(port));
 
-  // Server
-  TSimpleServer simpleServer(&testServer,
-                             &serverOptions,
-                             &serverSocket);
+  if(serverType == "simple") {
 
-  printf("Starting the server on port %d...\n", port);
-  simpleServer.run();
+    // Server
+    TSimpleServer simpleServer(testServer,
+			       serverOptions,
+			       serverSocket);
+
+    printf("Starting the server on port %d...\n", port);
+    simpleServer.run();
+
+  } else if(serverType == "thread-pool") {
+
+    shared_ptr<ThreadManager> threadManager = ThreadManager::newSimpleThreadManager(workerCount);
+
+    shared_ptr<PosixThreadFactory> threadFactory = shared_ptr<PosixThreadFactory>(new PosixThreadFactory());
+
+    threadManager->threadFactory(threadFactory);
+
+    threadManager->start();
+
+    TThreadPoolServer threadPoolServer(testServer,
+				       serverOptions,
+				       serverSocket,
+				       threadManager);
+
+    printf("Starting the server on port %d...\n", port);
+    threadPoolServer.run();
+  }
+
   printf("done.\n");
   return 0;
 }