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;
}