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);
   }