[ https://issues.apache.org/jira/browse/THRIFT-3768?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15225426#comment-15225426 ]
ASF GitHub Bot commented on THRIFT-3768: ---------------------------------------- Github user tpcwang commented on a diff in the pull request: https://github.com/apache/thrift/pull/977#discussion_r58473198 --- Diff: lib/cpp/src/thrift/server/TThreadedServer.cpp --- @@ -77,44 +83,29 @@ TThreadedServer::TThreadedServer(const shared_ptr<TProcessor>& processor, const shared_ptr<TProtocolFactory>& inputProtocolFactory, const shared_ptr<TProtocolFactory>& outputProtocolFactory, const shared_ptr<ThreadFactory>& threadFactory) - : TServerFramework(processor, - serverTransport, - inputTransportFactory, - outputTransportFactory, - inputProtocolFactory, - outputProtocolFactory), - threadFactory_(threadFactory) { + : TThreadPoolServer(processor, + serverTransport, + inputTransportFactory, + outputTransportFactory, + inputProtocolFactory, + outputProtocolFactory, + apache::thrift::concurrency::ThreadManager::newSimpleThreadManager(0, 0)) { + threadManager_->threadFactory(threadFactory); + threadManager_->start(); } TThreadedServer::~TThreadedServer() { } -void TThreadedServer::serve() { - TServerFramework::serve(); - - // Drain all clients - no more will arrive - try { - Synchronized s(clientsMonitor_); - while (getConcurrentClientCount() > 0) { - clientsMonitor_.wait(); - } - } catch (TException& tx) { - string errStr = string("TThreadedServer: Exception joining workers: ") + tx.what(); - GlobalOutput(errStr.c_str()); +void TThreadedServer::onClientConnected(const shared_ptr<TConnectedClient>& pClient) { + if (!threadManager_->idleWorkerCount()) --- End diff -- I would personally like to see how the threads would be reaped before we go down this path, but that's mostly because I am unfamiliar with the thread manager. I'll defer to you and the maintainers on whether to do this without the accompanying thread manager change. > TThreadedServer may crash if it is destroyed immediately after it returns > from serve() > -------------------------------------------------------------------------------------- > > Key: THRIFT-3768 > URL: https://issues.apache.org/jira/browse/THRIFT-3768 > Project: Thrift > Issue Type: Bug > Components: C++ - Library > Affects Versions: 0.9.3 > Reporter: Ted Wang > Assignee: James E. King, III > Priority: Minor > > Here's a sequence that shows the race: > Thread-1 (Users of TThreadedServer): Calls TThreadedServer::stop(), which > calls interruptChildren and initiates the tearing down of client connections. > Thread-2: In TServerFramework::serve(), broke out of accept, and now blocks > in TThreadedServer::serve() waiting to drain all the clients. > Thread-3 (The connected client thread created by TThreadedServer): In > disposeConnectedClient, running because the server is shutting down and the > shared_ptr specified this function to be the cleanup function for the client. > This thread just returned from onClientDisconnected and now context switches. > Thread-2: TThreadedServer::serve() is notified that all of the clients have > disconnected and completes. > Thread-1: Joins on Thread-2 and destroys the server object because it is done. > Thread-3: Finally gets a chance to run, but now encounters undefined behavior > because it is still executing a member function of an object that has been > destroyed. > You can force this race in action if you put sleep(1) before > onClientDisconnected() in disposeConnectedClient -- This message was sent by Atlassian JIRA (v6.3.4#6332)