]> git.mxchange.org Git - simgear.git/commitdiff
hla: catch exceptions in processMessages()
authorMathias Froehlich <Mathias.Froehlich@web.de>
Thu, 8 Nov 2012 20:31:16 +0000 (21:31 +0100)
committerMathias Froehlich <Mathias.Froehlich@web.de>
Thu, 8 Nov 2012 21:50:52 +0000 (22:50 +0100)
simgear/hla/RTI13Federate.cxx
simgear/hla/RTI13Federate.hxx

index 154a3b3363618bafd0793bae2ebfe4af9df3d93e..1a46cfdb581a599f6759759fc649065749ad0e31 100644 (file)
@@ -1566,7 +1566,7 @@ RTI13Federate::queryLITS(SGTimeStamp& timeStamp)
 bool
 RTI13Federate::processMessage()
 {
-    bool result = _ambassador->tick();
+    bool result = _tick();
     _federateAmbassador->processQueues();
     return result;
 }
@@ -1574,18 +1574,65 @@ RTI13Federate::processMessage()
 bool
 RTI13Federate::processMessages(const double& minimum, const double& maximum)
 {
-    bool result = _ambassador->tick(minimum, 0);
+    bool result = _tick(minimum, 0);
     _federateAmbassador->processQueues();
     if (!result)
         return false;
     SGTimeStamp timeStamp = SGTimeStamp::now() + SGTimeStamp::fromSec(maximum);
     do {
-        result = _ambassador->tick(0, 0);
+        result = _tick(0, 0);
         _federateAmbassador->processQueues();
     } while (result && SGTimeStamp::now() <= timeStamp);
     return result;
 }
 
+bool
+RTI13Federate::_tick()
+{
+    if (!_ambassador.valid()) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Ambassador is zero while calling _tick().");
+        return false;
+    }
+
+    try {
+        return _ambassador->tick();
+    } catch (RTI::SpecifiedSaveLabelDoesNotExist& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Specified save label does not exist: " << e._name << " " << e._reason);
+        return false;
+    } catch (RTI::ConcurrentAccessAttempted& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Concurrent access attempted: " << e._name << " " << e._reason);
+        return false;
+    } catch (RTI::RTIinternalError& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Internal error: " << e._name << " " << e._reason);
+        return false;
+    }
+    return false;
+}
+
+bool
+RTI13Federate::_tick(const double& minimum, const double& maximum)
+{
+    if (!_ambassador.valid()) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Ambassador is zero while calling _tick().");
+        return false;
+    }
+
+    try {
+        return _ambassador->tick(minimum, maximum);
+    } catch (RTI::SpecifiedSaveLabelDoesNotExist& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Specified save label does not exist: " << e._name << " " << e._reason);
+        return false;
+    } catch (RTI::ConcurrentAccessAttempted& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Concurrent access attempted: " << e._name << " " << e._reason);
+        return false;
+    } catch (RTI::RTIinternalError& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Internal error: " << e._name << " " << e._reason);
+        return false;
+    }
+    return false;
+}
+
+
 RTI13ObjectClass*
 RTI13Federate::createObjectClass(const std::string& objectClassName, HLAObjectClass* hlaObjectClass)
 {
index 83878ad0559baeaaa11e7d2a221825764345c4bd..ac6c5855e47ad566e8dc1609b886d0b201414081 100644 (file)
@@ -78,6 +78,10 @@ public:
     virtual bool processMessage();
     virtual bool processMessages(const double& minimum, const double& maximum);
 
+    // helper functions for the above
+    bool _tick();
+    bool _tick(const double& minimum, const double& maximum);
+
     virtual RTI13ObjectClass* createObjectClass(const std::string& name, HLAObjectClass* hlaObjectClass);
     virtual RTI13InteractionClass* createInteractionClass(const std::string& name, HLAInteractionClass* interactionClass);