Thrift CPP threading fixes

Reviewed By: karl


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665045 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/README b/README
index 26a53f7..e1bf59e 100644
--- a/README
+++ b/README
@@ -1,11 +1,8 @@
 Thrift (Thrift IDL and RPC tool)
-Version 1.0  (22 August 2006)
 
 Mark Slee (mcslee@facebook.com)
-Aditya Agarwal (aditya@facebook.com)
 Marc Kwiatkowski (marc@facebook.com)
-
-$Header$
+Aditya Agarwal (aditya@facebook.com)
 
 Thrift is distributed under the Thrift open source software license.
 Please see the included LICENSE file.
@@ -14,12 +11,51 @@
 ============
 
 Thrift is a lightweight, language-independent software stack with an
-associated code generation mechanism for RPC.
+associated code generation mechanism for RPC. Thrift provides clean
+abstractions for data transport, data serialization, and application
+level processing. The code generation system takes a simple definition
+language as its input and generates code across programming languages that
+uses the abstracted stack to build interoperable RPC clients and servers.
+
+For more details on Thrift's design and implementation, take a gander at
+the Thrift whitepaper included in this distribution or at the README files
+in a particular subdirectory of interest.
+
+Heirarchy
+=========
+
+thrift/
+
+  compiler/
+    Contains the Thrift compiler, implemented in C++.
+
+  lib/
+    Contains the Thrift software library implementation, subdivided by
+    language of implementation.
+
+    cpp/
+    java/
+    php/
+    py/
+    ruby/
+
+  test/
+
+    Contains sample Thrift files and test code across the target programming
+    languages.
+
 
 Requirements
 ============
-Thrift requires boost shared pointers from boost-1.33.1 or greater,
-see http://www.boost.org/libs/smart_ptr/smart_ptr.htm
+
+Thrift requires boost shared pointers from boost-1.33.1 or greater, see:
+http://www.boost.org/libs/smart_ptr/smart_ptr.htm
+
+Some portions of Thrift also depend upon libevent, see:
+http://monkey.org/~provos/libevent/
+
+These libraries are open source and may be freely obtained, but they are not
+provided as a part of this distribution.
 
 Resources
 =========
@@ -47,14 +83,17 @@
 	./configure
 
 You may need to specify the location of the boost files explicitly.
-If you installed boost in  /usr/local, you would run configure as follows:
+If you installed boost in /usr/local, you would run configure as follows:
 
 	./configure --with-boost=/usr/local
 
-Note that by default the thrift C++ library is built with no debugging symbols
-included. If you would like debugging symbols during development work, run:
+Note that by default the thrift C++ library is typically built with debugging
+symbols included. If you want to customize these options you should use the
+CXXFLAGS option in configure, as such:
 
+        ./configure CXXFLAGS='-g -O2'
         ./configure CFLAGS='-g -O2'
+        ./configure CPPFLAGS='-g -O2'
 
 Run ./configure --help to see other configuration options
 
diff --git a/compiler/cpp/configure.ac b/compiler/cpp/configure.ac
index eadb7f1..5408146 100644
--- a/compiler/cpp/configure.ac
+++ b/compiler/cpp/configure.ac
@@ -44,8 +44,4 @@
 
 AC_PROG_LIBTOOL
 
-CFLAGS="-O2"
-
-CXXFLAGS="-O2"
-
 AC_OUTPUT(Makefile)
diff --git a/lib/cpp/configure.ac b/lib/cpp/configure.ac
index 1f2763c..878e55a 100644
--- a/lib/cpp/configure.ac
+++ b/lib/cpp/configure.ac
@@ -28,6 +28,12 @@
 
 AC_CHECK_FUNCS([strtoul])
 
+AC_CHECK_FUNCS([memmove])
+
+AC_CHECK_FUNCS([strstr])
+
+AC_CHECK_FUNCS([strchr])
+
 AC_CHECK_HEADERS([arpa/inet.h])
 
 AC_CHECK_HEADERS([fcntl.h])
@@ -100,8 +106,4 @@
 
 AC_PROG_LIBTOOL
 
-CFLAGS="-g -O2"
-
-CXXFLAGS="-g -O2"
-
 AC_OUTPUT(Makefile)
diff --git a/lib/cpp/src/server/TSimpleServer.cpp b/lib/cpp/src/server/TSimpleServer.cpp
index e7d7e9b..40d7ed9 100644
--- a/lib/cpp/src/server/TSimpleServer.cpp
+++ b/lib/cpp/src/server/TSimpleServer.cpp
@@ -57,21 +57,21 @@
       outputTransport->close();
       client->close();    
     } catch (TTransportException& ttx) {
-      if (inputTransport.get() != NULL) { inputTransport->close(); }
-      if (outputTransport.get() != NULL) { outputTransport->close(); }
-      if (client.get() != NULL) { client->close(); }
+      if (inputTransport != NULL) { inputTransport->close(); }
+      if (outputTransport != NULL) { outputTransport->close(); }
+      if (client != NULL) { client->close(); }
       cerr << "TServerTransport died on accept: " << ttx.what() << endl;
       continue;
     } catch (TException& tx) {
-      if (inputTransport.get() != NULL) { inputTransport->close(); }
-      if (outputTransport.get() != NULL) { outputTransport->close(); }
-      if (client.get() != NULL) { client->close(); }
+      if (inputTransport != NULL) { inputTransport->close(); }
+      if (outputTransport != NULL) { outputTransport->close(); }
+      if (client != NULL) { client->close(); }
       cerr << "Some kind of accept exception: " << tx.what() << endl;
       continue;
     } catch (string s) {
-      if (inputTransport.get() != NULL) { inputTransport->close(); }
-      if (outputTransport.get() != NULL) { outputTransport->close(); }
-      if (client.get() != NULL) { client->close(); }
+      if (inputTransport != NULL) { inputTransport->close(); }
+      if (outputTransport != NULL) { outputTransport->close(); }
+      if (client != NULL) { client->close(); }
       cerr << "TThreadPoolServer: Unknown exception: " << s << endl;
       break;
     }
diff --git a/lib/cpp/src/server/TThreadPoolServer.cpp b/lib/cpp/src/server/TThreadPoolServer.cpp
index dcbf2f2..2542de9 100644
--- a/lib/cpp/src/server/TThreadPoolServer.cpp
+++ b/lib/cpp/src/server/TThreadPoolServer.cpp
@@ -42,7 +42,7 @@
     } catch (TTransportException& ttx) {
       // This is reasonably expected, client didn't send a full request so just
       // ignore him
-      //cerr << "TThreadPoolServer client died: " << ttx.what() << endl;
+      cerr << "TThreadPoolServer client died: " << ttx.what() << endl;
     } catch (TException& x) {
       cerr << "TThreadPoolServer exception: " << x.what() << endl;
     } catch (...) {
@@ -100,6 +100,12 @@
   
   while (!stop_) {
     try {
+      client.reset();
+      inputTransport.reset();
+      outputTransport.reset();
+      inputProtocol.reset();
+      outputProtocol.reset();
+
       // Fetch client from server
       client = serverTransport_->accept();
 
@@ -113,23 +119,23 @@
       threadManager_->add(shared_ptr<TThreadPoolServer::Task>(new TThreadPoolServer::Task(processor_, inputProtocol, outputProtocol)));
 
     } catch (TTransportException& ttx) {
-      if (inputTransport.get() != NULL) { inputTransport->close(); }
-      if (outputTransport.get() != NULL) { outputTransport->close(); }
-      if (client.get() != NULL) { client->close(); }
+      if (inputTransport != NULL) { inputTransport->close(); }
+      if (outputTransport != NULL) { outputTransport->close(); }
+      if (client != NULL) { client->close(); }
       if (!stop_ || ttx.getType() != TTransportException::INTERRUPTED) {
         cerr << "TThreadPoolServer: TServerTransport died on accept: " << ttx.what() << endl;
       }
       continue;
     } catch (TException& tx) {
-      if (inputTransport.get() != NULL) { inputTransport->close(); }
-      if (outputTransport.get() != NULL) { outputTransport->close(); }
-      if (client.get() != NULL) { client->close(); }
+      if (inputTransport != NULL) { inputTransport->close(); }
+      if (outputTransport != NULL) { outputTransport->close(); }
+      if (client != NULL) { client->close(); }
       cerr << "TThreadPoolServer: Caught TException: " << tx.what() << endl;
       continue;
     } catch (string s) {
-      if (inputTransport.get() != NULL) { inputTransport->close(); }
-      if (outputTransport.get() != NULL) { outputTransport->close(); }
-      if (client.get() != NULL) { client->close(); }
+      if (inputTransport != NULL) { inputTransport->close(); }
+      if (outputTransport != NULL) { outputTransport->close(); }
+      if (client != NULL) { client->close(); }
       cerr << "TThreadPoolServer: Unknown exception: " << s << endl;
       break;
     }