Mercurial > hg > orthanc
diff OrthancServer/DicomProtocol/DicomServer.cpp @ 1680:4113a9a668b1
refactoring
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 06 Oct 2015 13:36:09 +0200 |
parents | d3ba98d6b6e9 |
children | ee4367497d0d |
line wrap: on
line diff
--- a/OrthancServer/DicomProtocol/DicomServer.cpp Tue Oct 06 13:31:40 2015 +0200 +++ b/OrthancServer/DicomProtocol/DicomServer.cpp Tue Oct 06 13:36:09 2015 +0200 @@ -58,38 +58,34 @@ }; - void DicomServer::ServerThread(DicomServer* server) + void DicomServer::ServerThread(DicomServer* server, + T_ASC_Network *network) { - /* initialize network, i.e. create an instance of T_ASC_Network*. */ - T_ASC_Network *net; - OFCondition cond = ASC_initializeNetwork - (NET_ACCEPTOR, OFstatic_cast(int, server->port_), /*opt_acse_timeout*/ 30, &net); - if (cond.bad()) - { - LOG(ERROR) << "cannot create network: " << cond.text(); - throw OrthancException(ErrorCode_DicomPortInUse); - } - LOG(INFO) << "DICOM server started"; - server->started_ = true; - while (server->continue_) { /* 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, net)); + std::auto_ptr<Internals::CommandDispatcher> dispatcher(Internals::AcceptAssociation(*server, network)); - if (dispatcher.get() != NULL) + try { - if (server->isThreaded_) + if (dispatcher.get() != NULL) { - server->bagOfDispatchers_.Add(dispatcher.release()); + if (server->isThreaded_) + { + server->bagOfDispatchers_.Add(dispatcher.release()); + } + else + { + IRunnableBySteps::RunUntilDone(*dispatcher); + } } - else - { - IRunnableBySteps::RunUntilDone(*dispatcher); - } + } + catch (OrthancException& e) + { + LOG(ERROR) << "Exception in the DICOM server thread: " << e.What(); } } @@ -102,12 +98,12 @@ /* drop the network, i.e. free memory of T_ASC_Network* structure. This call */ /* is the counterpart of ASC_initializeNetwork(...) which was called above. */ - cond = ASC_dropNetwork(&net); + OFCondition cond = ASC_dropNetwork(&network); if (cond.bad()) { LOG(ERROR) << "Error while dropping the network: " << cond.text(); } - } + } DicomServer::DicomServer() : @@ -122,8 +118,7 @@ checkCalledAet_ = true; clientTimeout_ = 30; isThreaded_ = true; - continue_ = false; - started_ = false; + continue_ = true; } DicomServer::~DicomServer() @@ -308,14 +303,19 @@ void DicomServer::Start() { Stop(); - continue_ = true; - started_ = false; - pimpl_->thread_ = boost::thread(ServerThread, this); - while (!started_) + /* 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); + if (cond.bad()) { - Toolbox::USleep(50000); // Wait 50ms + LOG(ERROR) << "cannot create network: " << cond.text(); + throw OrthancException(ErrorCode_DicomPortInUse); } + + continue_ = true; + pimpl_->thread_ = boost::thread(ServerThread, this, network); }