]> git.mxchange.org Git - simgear.git/blobdiff - simgear/hla/RTI13Federate.cxx
Fix #1783: repeated error message on console
[simgear.git] / simgear / hla / RTI13Federate.cxx
index c9dbfac2781a4db96d22745fe49da05bc4a9e7ba..9ceb828332938cfdb4b77f56f651a779f615ef5b 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 - 2011  Mathias Froehlich - Mathias.Froehlich@web.de
+// Copyright (C) 2009 - 2012  Mathias Froehlich - Mathias.Froehlich@web.de
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Library General Public
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 
+#ifdef HAVE_CONFIG_H
+#  include <simgear_config.h>
+#endif
+
+#include <simgear/compiler.h>
+
 #include "RTI13Federate.hxx"
 
 #include "RTI13Ambassador.hxx"
@@ -1557,29 +1563,80 @@ RTI13Federate::queryLITS(SGTimeStamp& timeStamp)
     return true;
 }
 
-bool
+RTI13Federate::ProcessMessageResult
 RTI13Federate::processMessage()
 {
-    bool result = _ambassador->tick();
+    ProcessMessageResult result = _tick();
     _federateAmbassador->processQueues();
     return result;
 }
 
-bool
+RTI13Federate::ProcessMessageResult
 RTI13Federate::processMessages(const double& minimum, const double& maximum)
 {
-    bool result = _ambassador->tick(minimum, 0);
+    ProcessMessageResult result = _tick(minimum, 0);
     _federateAmbassador->processQueues();
-    if (!result)
-        return false;
+    if (result != ProcessMessagePending)
+        return result;
     SGTimeStamp timeStamp = SGTimeStamp::now() + SGTimeStamp::fromSec(maximum);
     do {
-        result = _ambassador->tick(0, 0);
+        result = _tick(0, 0);
         _federateAmbassador->processQueues();
-    } while (result && SGTimeStamp::now() <= timeStamp);
+    } while (result == ProcessMessagePending && SGTimeStamp::now() <= timeStamp);
     return result;
 }
 
+RTI13Federate::ProcessMessageResult
+RTI13Federate::_tick()
+{
+    if (!_ambassador.valid()) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Ambassador is zero while calling _tick().");
+        return ProcessMessageFatal;
+    }
+
+    try {
+        if (_ambassador->tick())
+            return ProcessMessagePending;
+        return ProcessMessageLast;
+    } catch (RTI::SpecifiedSaveLabelDoesNotExist& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Specified save label does not exist: " << e._name << " " << e._reason);
+        return ProcessMessageFatal;
+    } catch (RTI::ConcurrentAccessAttempted& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Concurrent access attempted: " << e._name << " " << e._reason);
+        return ProcessMessageFatal;
+    } catch (RTI::RTIinternalError& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Internal error: " << e._name << " " << e._reason);
+        return ProcessMessageFatal;
+    }
+    return ProcessMessageFatal;
+}
+
+RTI13Federate::ProcessMessageResult
+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 ProcessMessageFatal;
+    }
+
+    try {
+        if (_ambassador->tick(minimum, maximum))
+            return ProcessMessagePending;
+        return ProcessMessageLast;
+    } catch (RTI::SpecifiedSaveLabelDoesNotExist& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Specified save label does not exist: " << e._name << " " << e._reason);
+        return ProcessMessageFatal;
+    } catch (RTI::ConcurrentAccessAttempted& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Concurrent access attempted: " << e._name << " " << e._reason);
+        return ProcessMessageFatal;
+    } catch (RTI::RTIinternalError& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Internal error: " << e._name << " " << e._reason);
+        return ProcessMessageFatal;
+    }
+    return ProcessMessageFatal;
+}
+
+
 RTI13ObjectClass*
 RTI13Federate::createObjectClass(const std::string& objectClassName, HLAObjectClass* hlaObjectClass)
 {