Mercurial > hg > orthanc
diff OrthancServer/DicomProtocol/DicomServer.cpp @ 1682:6414043df7d8 db-changes
integration mainline->db-changes
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 06 Oct 2015 14:09:30 +0200 |
parents | f079f3efe33b ee4367497d0d |
children | 164d78911382 |
line wrap: on
line diff
--- a/OrthancServer/DicomProtocol/DicomServer.cpp Tue Oct 06 11:12:13 2015 +0200 +++ b/OrthancServer/DicomProtocol/DicomServer.cpp Tue Oct 06 14:09:30 2015 +0200 @@ -40,6 +40,7 @@ #include "../Internals/CommandDispatcher.h" #include "../OrthancInitialization.h" #include "EmbeddedResources.h" +#include "../../Core/MultiThreading/RunnableWorkersPool.h" #include <boost/thread.hpp> @@ -52,14 +53,13 @@ { struct DicomServer::PImpl { - boost::thread thread_; - - //std::set< + boost::thread thread_; + T_ASC_Network *network_; + std::auto_ptr<RunnableWorkersPool> workers_; }; - void DicomServer::ServerThread(DicomServer* server, - T_ASC_Network *network) + void DicomServer::ServerThread(DicomServer* server) { LOG(INFO) << "DICOM server started"; @@ -67,20 +67,13 @@ { /* receive an association and acknowledge or reject it. If the association was */ /* acknowledged, offer corresponding services and invoke one or more if required. */ - std::auto_ptr<Internals::CommandDispatcher> dispatcher(Internals::AcceptAssociation(*server, network)); + std::auto_ptr<Internals::CommandDispatcher> dispatcher(Internals::AcceptAssociation(*server, server->pimpl_->network_)); try { if (dispatcher.get() != NULL) { - if (server->isThreaded_) - { - server->bagOfDispatchers_.Add(dispatcher.release()); - } - else - { - IRunnableBySteps::RunUntilDone(*dispatcher); - } + server->pimpl_->workers_->Add(dispatcher.release()); } } catch (OrthancException& e) @@ -90,19 +83,6 @@ } LOG(INFO) << "DICOM server stopping"; - - if (server->isThreaded_) - { - server->bagOfDispatchers_.StopAll(); - } - - /* drop the network, i.e. free memory of T_ASC_Network* structure. This call */ - /* is the counterpart of ASC_initializeNetwork(...) which was called above. */ - OFCondition cond = ASC_dropNetwork(&network); - if (cond.bad()) - { - LOG(ERROR) << "Error while dropping the network: " << cond.text(); - } } @@ -117,8 +97,7 @@ applicationEntityFilter_ = NULL; checkCalledAet_ = true; clientTimeout_ = 30; - isThreaded_ = true; - continue_ = true; + continue_ = false; } DicomServer::~DicomServer() @@ -141,17 +120,6 @@ return port_; } - void DicomServer::SetThreaded(bool isThreaded) - { - Stop(); - isThreaded_ = isThreaded; - } - - bool DicomServer::IsThreaded() const - { - return isThreaded_; - } - void DicomServer::SetClientTimeout(uint32_t timeout) { Stop(); @@ -305,9 +273,8 @@ Stop(); /* initialize network, i.e. create an instance of T_ASC_Network*. */ - T_ASC_Network *network; OFCondition cond = ASC_initializeNetwork - (NET_ACCEPTOR, OFstatic_cast(int, port_), /*opt_acse_timeout*/ 30, &network); + (NET_ACCEPTOR, OFstatic_cast(int, port_), /*opt_acse_timeout*/ 30, &pimpl_->network_); if (cond.bad()) { LOG(ERROR) << "cannot create network: " << cond.text(); @@ -315,7 +282,8 @@ } continue_ = true; - pimpl_->thread_ = boost::thread(ServerThread, this, network); + pimpl_->workers_.reset(new RunnableWorkersPool(4)); // Use 4 workers - TODO as a parameter? + pimpl_->thread_ = boost::thread(ServerThread, this); } @@ -330,7 +298,15 @@ pimpl_->thread_.join(); } - bagOfDispatchers_.Finalize(); + pimpl_->workers_.reset(NULL); + + /* drop the network, i.e. free memory of T_ASC_Network* structure. This call */ + /* is the counterpart of ASC_initializeNetwork(...) which was called above. */ + OFCondition cond = ASC_dropNetwork(&pimpl_->network_); + if (cond.bad()) + { + LOG(ERROR) << "Error while dropping the network: " << cond.text(); + } } }