Mercurial > hg > orthanc
diff OrthancServer/DicomProtocol/DicomServer.cpp @ 1675:131136aeeaa7 db-changes
improved exception handling in the main program
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 02 Oct 2015 13:57:54 +0200 |
parents | d3ba98d6b6e9 |
children | f079f3efe33b |
line wrap: on
line diff
--- a/OrthancServer/DicomProtocol/DicomServer.cpp Fri Oct 02 13:31:39 2015 +0200 +++ b/OrthancServer/DicomProtocol/DicomServer.cpp Fri Oct 02 13:57:54 2015 +0200 @@ -58,56 +58,52 @@ }; - 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"; - 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, network)); - 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)); - - if (dispatcher.get() != NULL) - { - if (server->isThreaded_) + try { - server->bagOfDispatchers_.Add(dispatcher.release()); + if (dispatcher.get() != NULL) + { + if (server->isThreaded_) + { + server->bagOfDispatchers_.Add(dispatcher.release()); + } + else + { + IRunnableBySteps::RunUntilDone(*dispatcher); + } + } } - else + catch (OrthancException& e) { - IRunnableBySteps::RunUntilDone(*dispatcher); + LOG(ERROR) << "Exception in the DICOM server thread: " << e.What(); } } - } - LOG(INFO) << "DICOM server stopping"; + LOG(INFO) << "DICOM server stopping"; - if (server->isThreaded_) - { - server->bagOfDispatchers_.StopAll(); - } + 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. */ - cond = ASC_dropNetwork(&net); - if (cond.bad()) - { - LOG(ERROR) << "Error while dropping the network: " << cond.text(); - } - } + /* 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(); + } + } 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); }