From 3303f360818aa39fc197f1f73ce3f7d578fbc2b1 Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Mon, 5 Mar 2007 20:09:37 +0000 Subject: [PATCH] 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 --- README | 59 ++++++++++++++++++++---- compiler/cpp/configure.ac | 4 -- lib/cpp/configure.ac | 10 ++-- lib/cpp/src/server/TSimpleServer.cpp | 18 ++++---- lib/cpp/src/server/TThreadPoolServer.cpp | 26 +++++++---- 5 files changed, 80 insertions(+), 37 deletions(-) diff --git a/README b/README index 26a53f7a..e1bf59e6 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 @@ Introduction ============ 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 @@ From the top directory, do: ./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 eadb7f1a..54081462 100644 --- a/compiler/cpp/configure.ac +++ b/compiler/cpp/configure.ac @@ -44,8 +44,4 @@ AC_PROG_INSTALL AC_PROG_LIBTOOL -CFLAGS="-O2" - -CXXFLAGS="-O2" - AC_OUTPUT(Makefile) diff --git a/lib/cpp/configure.ac b/lib/cpp/configure.ac index 1f2763c8..878e55aa 100644 --- a/lib/cpp/configure.ac +++ b/lib/cpp/configure.ac @@ -28,6 +28,12 @@ AC_CHECK_FUNCS([strtol]) 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_INSTALL 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 e7d7e9b9..40d7ed96 100644 --- a/lib/cpp/src/server/TSimpleServer.cpp +++ b/lib/cpp/src/server/TSimpleServer.cpp @@ -57,21 +57,21 @@ void TSimpleServer::serve() { 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 dcbf2f2f..2542de9d 100644 --- a/lib/cpp/src/server/TThreadPoolServer.cpp +++ b/lib/cpp/src/server/TThreadPoolServer.cpp @@ -42,7 +42,7 @@ public: } 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 @@ void TThreadPoolServer::serve() { while (!stop_) { try { + client.reset(); + inputTransport.reset(); + outputTransport.reset(); + inputProtocol.reset(); + outputProtocol.reset(); + // Fetch client from server client = serverTransport_->accept(); @@ -113,23 +119,23 @@ void TThreadPoolServer::serve() { threadManager_->add(shared_ptr(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; } -- 2.17.1