Thrift: C++ peek() method and TException not Exception


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664876 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/cpp/src/server/TNonblockingServer.cpp b/lib/cpp/src/server/TNonblockingServer.cpp
index 75a209e..a7c8393 100644
--- a/lib/cpp/src/server/TNonblockingServer.cpp
+++ b/lib/cpp/src/server/TNonblockingServer.cpp
@@ -154,10 +154,14 @@
     try {
       // Invoke the processor
       server_->getProcessor()->process(inputProtocol_, outputProtocol_);
-    } catch (TTransportException &x) {
-      fprintf(stderr, "Server::process %s\n", x.getMessage().c_str());
+    } catch (TTransportException &ttx) {
+      fprintf(stderr, "Server::process() %s\n", ttx.what());
       close();
-      return;    
+      return;
+    } catch (TException &x) {
+      fprintf(stderr, "Server::process() %s\n", x.what());
+      close();     
+      return;
     } catch (...) {
       fprintf(stderr, "Server::process() unknown exception\n");
       close();
diff --git a/lib/cpp/src/server/TNonblockingServer.h b/lib/cpp/src/server/TNonblockingServer.h
index faa572f..11b58b1 100644
--- a/lib/cpp/src/server/TNonblockingServer.h
+++ b/lib/cpp/src/server/TNonblockingServer.h
@@ -186,7 +186,7 @@
   TConnection(int socket, short eventFlags, TNonblockingServer *s) {
     readBuffer_ = (uint8_t*)malloc(1024);
     if (readBuffer_ == NULL) {
-      throw new facebook::thrift::Exception("Out of memory.");
+      throw new facebook::thrift::TException("Out of memory.");
     }
     readBufferSize_ = 1024;
     
diff --git a/lib/cpp/src/server/TSimpleServer.cpp b/lib/cpp/src/server/TSimpleServer.cpp
index 3eb035e..b453ce6 100644
--- a/lib/cpp/src/server/TSimpleServer.cpp
+++ b/lib/cpp/src/server/TSimpleServer.cpp
@@ -21,7 +21,7 @@
     // Start the server listening
     serverTransport_->listen();
   } catch (TTransportException& ttx) {
-    cerr << "TSimpleServer::run() listen(): " << ttx.getMessage() << endl;
+    cerr << "TSimpleServer::run() listen(): " << ttx.what() << endl;
     return;
   }
 
@@ -32,16 +32,21 @@
       iot = transportFactory_->getIOTransports(client);
       iop = protocolFactory_->getIOProtocols(iot.first, iot.second);
       try {
-        while (processor_->process(iop.first, iop.second)) {}
+        while (processor_->process(iop.first, iop.second)) {
+          // Peek ahead, is the remote side closed?
+          if (!iot.first->peek()) {
+            break;
+          }
+        }
       } catch (TTransportException& ttx) {
-        cerr << "TSimpleServer client died: " << ttx.getMessage() << endl;
+        cerr << "TSimpleServer client died: " << ttx.what() << endl;
       }
       iot.first->close();
       iot.second->close();
       client->close();
     }
   } catch (TTransportException& ttx) {
-    cerr << "TServerTransport died on accept: " << ttx.getMessage() << endl;
+    cerr << "TServerTransport died on accept: " << ttx.what() << endl;
   }
 
   // TODO(mcslee): Could this be a timeout case? Or always the real thing?
diff --git a/lib/cpp/src/server/TThreadPoolServer.cpp b/lib/cpp/src/server/TThreadPoolServer.cpp
index 7885f0f..357152b 100644
--- a/lib/cpp/src/server/TThreadPoolServer.cpp
+++ b/lib/cpp/src/server/TThreadPoolServer.cpp
@@ -8,6 +8,7 @@
 namespace facebook { namespace thrift { namespace server { 
 
 using namespace std;
+using namespace facebook::thrift;
 using namespace facebook::thrift::concurrency;
 using namespace facebook::thrift::transport;
 
@@ -26,14 +27,18 @@
   ~Task() {}
     
   void run() {     
-    while(true) {
-      try {
-	processor_->process(input_, output_);
-      } catch (TTransportException& ttx) {
-        break;
-      } catch(...) {
-        break;
+    try {
+      while (processor_->process(input_, output_)) {
+        if (!input_->getInputTransport()->peek()) {
+          break;
+        }
       }
+    } catch (TTransportException& ttx) {
+      cerr << "TThreadPoolServer client died: " << ttx.what() << endl;
+    } catch (TException& x) {
+      cerr << "TThreadPoolServer exception: " << x.what() << endl;
+    } catch (...) {
+      cerr << "TThreadPoolServer uncaught exception." << endl;
     }
     input_->getInputTransport()->close();
     output_->getOutputTransport()->close();
@@ -68,7 +73,7 @@
     // Start the server listening
     serverTransport_->listen();
   } catch (TTransportException& ttx) {
-    cerr << "TThreadPoolServer::run() listen(): " << ttx.getMessage() << endl;
+    cerr << "TThreadPoolServer::run() listen(): " << ttx.what() << endl;
     return;
   }