certi-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[certi-cvs] certi RTIA/RTIA_federate.cc RTIA/Statistics.cc ...


From: certi-cvs
Subject: [certi-cvs] certi RTIA/RTIA_federate.cc RTIA/Statistics.cc ...
Date: Thu, 06 Nov 2008 14:28:59 +0000

CVSROOT:        /sources/certi
Module name:    certi
Changes by:     Petr Gotthard <gotthardp>       08/11/06 14:28:58

Modified files:
        RTIA           : RTIA_federate.cc Statistics.cc 
        libCERTI       : Message.hh 
        libRTI         : RTIambPrivateRefs.cc RTIambPrivateRefs.hh 
                         RTIambassador.cc 

Log message:
        Bug #24746: Fixed CERTI crash after exception in FederateAmbassador.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/RTIA/RTIA_federate.cc?cvsroot=certi&r1=3.93&r2=3.94
http://cvs.savannah.gnu.org/viewcvs/certi/RTIA/Statistics.cc?cvsroot=certi&r1=3.17&r2=3.18
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/Message.hh?cvsroot=certi&r1=3.52&r2=3.53
http://cvs.savannah.gnu.org/viewcvs/certi/libRTI/RTIambPrivateRefs.cc?cvsroot=certi&r1=3.14&r2=3.15
http://cvs.savannah.gnu.org/viewcvs/certi/libRTI/RTIambPrivateRefs.hh?cvsroot=certi&r1=3.5&r2=3.6
http://cvs.savannah.gnu.org/viewcvs/certi/libRTI/RTIambassador.cc?cvsroot=certi&r1=3.96&r2=3.97

Patches:
Index: RTIA/RTIA_federate.cc
===================================================================
RCS file: /sources/certi/certi/RTIA/RTIA_federate.cc,v
retrieving revision 3.93
retrieving revision 3.94
diff -u -b -r3.93 -r3.94
--- RTIA/RTIA_federate.cc       1 Nov 2008 19:19:36 -0000       3.93
+++ RTIA/RTIA_federate.cc       6 Nov 2008 14:28:58 -0000       3.94
@@ -71,6 +71,7 @@
       case Message::RESIGN_FEDERATION_EXECUTION:
       case Message::TICK_REQUEST:
       case Message::TICK_REQUEST_NEXT:
+      case Message::TICK_REQUEST_STOP:
       case Message::GET_OBJECT_CLASS_HANDLE:
       case Message::GET_OBJECT_CLASS_NAME:
       case Message::GET_ATTRIBUTE_HANDLE:
@@ -1000,6 +1001,7 @@
         break ;
 
       case Message::TICK_REQUEST:
+        // called when tick() is invoked
         if (tm->_tick_state != TimeManagement::NO_TICK)
             throw RTIinternalError("TICK_REQUEST cannot be called 
recursively");
 
@@ -1019,6 +1021,7 @@
         break ;
 
       case Message::TICK_REQUEST_NEXT:
+        // called when tick() queries result, or next callback
         if (tm->_tick_state != TimeManagement::TICK_CALLBACK &&
             tm->_tick_state != TimeManagement::TICK_RETURN)
             throw RTIinternalError("unexpected TICK_REQUEST_NEXT");
@@ -1026,6 +1029,14 @@
         processOngoingTick();
         break ;
 
+      case Message::TICK_REQUEST_STOP:
+        // called to terminate tick() when error occured
+        // do not invoke any callbacks, reset _tick_state and return
+        tm->_tick_state = TimeManagement::TICK_RETURN;
+
+        processOngoingTick();
+        break ;
+
       case Message::ENABLE_CLASS_RELEVANCE_ADVISORY_SWITCH:
         D.Out(pdTrace,
               "Receiving Message from Federate, type 
EnableClassRelevanceAdvisorySwitch.");
@@ -1495,7 +1506,8 @@
     delete req;
 
     if (rep.type != Message::TICK_REQUEST &&
-        rep.type != Message::TICK_REQUEST_NEXT) {
+        rep.type != Message::TICK_REQUEST_NEXT &&
+        rep.type != Message::TICK_REQUEST_STOP) {
        // generic federate service acknowledgment
        // the TICK_REQUEST confirmation is generated in processOngoingTick()
        comm->sendUN(&rep);

Index: RTIA/Statistics.cc
===================================================================
RCS file: /sources/certi/certi/RTIA/Statistics.cc,v
retrieving revision 3.17
retrieving revision 3.18
diff -u -b -r3.17 -r3.18
--- RTIA/Statistics.cc  10 Oct 2008 15:18:22 -0000      3.17
+++ RTIA/Statistics.cc  6 Nov 2008 14:28:58 -0000       3.18
@@ -212,6 +212,7 @@
        FED_MSG_NAME(Message::DISABLE_INTERACTION_RELEVANCE_ADVISORY_SWITCH);
        FED_MSG_NAME(Message::TICK_REQUEST);
        FED_MSG_NAME(Message::TICK_REQUEST_NEXT);
+       FED_MSG_NAME(Message::TICK_REQUEST_STOP);
 
        // RTI messages
        RTI_MSG_NAME(NetworkMessage::CLOSE_CONNEXION);
@@ -367,4 +368,4 @@
 #undef FED_MSG_NAME
 #undef RTI_MSG_NAME
 
-// $Id: Statistics.cc,v 3.17 2008/10/10 15:18:22 gotthardp Exp $
+// $Id: Statistics.cc,v 3.18 2008/11/06 14:28:58 gotthardp Exp $

Index: libCERTI/Message.hh
===================================================================
RCS file: /sources/certi/certi/libCERTI/Message.hh,v
retrieving revision 3.52
retrieving revision 3.53
diff -u -b -r3.52 -r3.53
--- libCERTI/Message.hh 28 Oct 2008 12:07:26 -0000      3.52
+++ libCERTI/Message.hh 6 Nov 2008 14:28:58 -0000       3.53
@@ -236,6 +236,7 @@
         DISABLE_INTERACTION_RELEVANCE_ADVISORY_SWITCH,
         TICK_REQUEST,
         TICK_REQUEST_NEXT,
+        TICK_REQUEST_STOP,
 
        LAST // should be the "last" (not used)
     };

Index: libRTI/RTIambPrivateRefs.cc
===================================================================
RCS file: /sources/certi/certi/libRTI/RTIambPrivateRefs.cc,v
retrieving revision 3.14
retrieving revision 3.15
diff -u -b -r3.14 -r3.15
--- libRTI/RTIambPrivateRefs.cc 28 Oct 2008 12:07:27 -0000      3.14
+++ libRTI/RTIambPrivateRefs.cc 6 Nov 2008 14:28:58 -0000       3.15
@@ -19,7 +19,7 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 // USA
 //
-// $Id: RTIambPrivateRefs.cc,v 3.14 2008/10/28 12:07:27 gotthardp Exp $
+// $Id: RTIambPrivateRefs.cc,v 3.15 2008/11/06 14:28:58 gotthardp Exp $
 // ----------------------------------------------------------------------------
 
 #include <config.h>
@@ -92,11 +92,44 @@
     }
 
     D.Out(pdDebug, "processing returned exception (from reply).");
+    // the services may only throw exceptions defined in the HLA standard
+    // the RTIA is responsible for sending 'allowed' exceptions only
     processException(rep);
+
     D.Out(pdDebug, "exception processed.");
     G.Out(pdGendoc,"exit RTIambPrivateRefs::executeService");
 }
 
+void
+RTIambPrivateRefs::sendTickRequestStop()
+{
+    G.Out(pdGendoc,"enter RTIambPrivateRefs::sendTickRequestStop");
+
+    Message req, rep ;
+    req.type = Message::TICK_REQUEST_STOP;
+
+    try {
+        req.send(socketUn, msgBufSend);
+    }
+    catch (NetworkError) {
+        std::cerr << "libRTI: exception: NetworkError (write)" << std::endl ;
+        throw RTIinternalError("libRTI: Network Write Error");
+    }
+
+    try {
+        rep.receive(socketUn, msgBufReceive);
+    }
+    catch (NetworkError) {
+        std::cerr << "libRTI: exception: NetworkError (read)" << std::endl ;
+        throw RTIinternalError("libRTI: Network Read Error waiting RTI reply");
+    }
+
+    // ignore the response, ignore exceptions
+    // rep->type == Message::TICK_REQUEST;
+
+    G.Out(pdGendoc,"exit RTIambPrivateRefs::sendTickRequestStop");
+}
+
 // ----------------------------------------------------------------------------
 //! Process exception from received message.
 /*! When a message is received from RTIA, it can contains an exception.
@@ -539,4 +572,329 @@
     }
 }
 
-// $Id: RTIambPrivateRefs.cc,v 3.14 2008/10/28 12:07:27 gotthardp Exp $
+#define CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS(service) \
+    catch (Exception &e) { \
+        std::stringstream msg; \
+        msg << "Error in " << service << ": " << e._name << "[" << e._reason 
<< "]"; \
+        throw RTIinternalError(msg.str().c_str()); \
+    }
+
+void
+RTIambPrivateRefs::callFederateAmbassador(Message *msg)
+    throw (RTIinternalError)
+{
+    switch (msg->type) {
+
+      case Message::SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:
+        try {
+            
fed_amb->synchronizationPointRegistrationSucceeded((msg->getLabel()).c_str());
+        }
+        
CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("synchronizationPointRegistrationSucceeded")
+        break ;
+
+      case Message::ANNOUNCE_SYNCHRONIZATION_POINT:
+        try {
+            
fed_amb->announceSynchronizationPoint((msg->getLabel()).c_str(),(msg->getTag()).c_str());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("announceSynchronizationPoint")
+        break ;
+
+      case Message::FEDERATION_SYNCHRONIZED:
+        try {
+            fed_amb->federationSynchronized((msg->getLabel()).c_str());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("federationSynchronized")
+        break ;
+
+      case Message::INITIATE_FEDERATE_SAVE:
+        try {
+            fed_amb->initiateFederateSave((msg->getLabel()).c_str());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("initiateFederateSave")
+        break ;
+
+      case Message::FEDERATION_SAVED:
+        try {
+            fed_amb->federationSaved();
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("federationSaved")
+        break ;
+
+      case Message::REQUEST_FEDERATION_RESTORE_SUCCEEDED:
+        try {
+            fed_amb->requestFederationRestoreSucceeded(
+                (msg->getLabel()).c_str());
+        }
+        
CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("requestFederationRestoreSucceeded")
+        break ;
+
+      case Message::REQUEST_FEDERATION_RESTORE_FAILED:
+        try {
+            fed_amb->requestFederationRestoreFailed((msg->getLabel()).c_str(),
+                                                (msg->getTag()).c_str());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("requestFederationRestoreFailed")
+        break ;
+
+      case Message::FEDERATION_RESTORE_BEGUN:
+        try {
+            fed_amb->federationRestoreBegun();
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("federationRestoreBegun")
+        break ;
+
+      case Message::INITIATE_FEDERATE_RESTORE:
+        try {
+            fed_amb->initiateFederateRestore((msg->getLabel()).c_str(),
+                                         msg->getFederate());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("initiateFederateRestore")
+        break ;
+
+      case Message::FEDERATION_RESTORED:
+        try {
+            fed_amb->federationRestored();
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("federationRestored")
+        break ;
+
+      case Message::FEDERATION_NOT_RESTORED:
+        try {
+            fed_amb->federationNotRestored();
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("federationNotRestored")
+        break ;
+
+      case Message::START_REGISTRATION_FOR_OBJECT_CLASS:
+        try {
+            fed_amb->startRegistrationForObjectClass(
+                msg->getObjectClass());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("startRegistrationForObjectClass")
+        break ;
+
+      case Message::STOP_REGISTRATION_FOR_OBJECT_CLASS:
+        try {
+            fed_amb->stopRegistrationForObjectClass(msg->getObjectClass());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("stopRegistrationForObjectClass")
+        break ;
+
+      case Message::TURN_INTERACTIONS_ON:
+        try {
+            fed_amb->turnInteractionsOn(msg->getInteractionClass());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("turnInteractionsOn")
+        break ;
+
+      case Message::TURN_INTERACTIONS_OFF:
+        try {
+            fed_amb->turnInteractionsOff(msg->getInteractionClass());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("turnInteractionsOff")
+        break ;
+
+      case Message::DISCOVER_OBJECT_INSTANCE:
+        try {
+            fed_amb->discoverObjectInstance(msg->getObject(),
+                                            msg->getObjectClass(),
+                                            msg->getName().c_str());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("discoverObjectInstance")
+        break ;
+
+      case Message::REFLECT_ATTRIBUTE_VALUES:
+        try {
+            G.Out(pdGendoc,"          tick_kernel call to 
reflectAttributeValues");
+            RTI::AttributeHandleValuePairSet *attributes = msg->getAHVPS();
+            if (msg->getBoolean())
+               fed_amb->reflectAttributeValues(msg->getObject(),
+                                               *attributes,
+                                               msg->getFedTime(),
+                                               (msg->getTag()).c_str(),
+                                               msg->getEventRetraction());
+            else
+               fed_amb->reflectAttributeValues(msg->getObject(),
+                                               *attributes,
+                                               (msg->getTag()).c_str());
+            delete attributes ;
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("reflectAttributeValues")
+        break ;
+
+      case Message::RECEIVE_INTERACTION:
+        try {
+            RTI::ParameterHandleValuePairSet *parameters = msg->getPHVPS();
+            if (msg->getBoolean())
+                fed_amb->receiveInteraction(
+                                        msg->getInteractionClass(),
+                                        *parameters,
+                                        msg->getFedTime(),
+                                        (msg->getTag()).c_str(),
+                                        msg->getEventRetraction());
+            else
+                fed_amb->receiveInteraction(
+                                        msg->getInteractionClass(),
+                                        *parameters,
+                                        (msg->getTag()).c_str());
+
+            delete parameters ;
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("receiveInteraction")
+        break ;
+
+      case Message::REMOVE_OBJECT_INSTANCE:
+        try {
+            if (msg->getBoolean()) {
+                fed_amb->removeObjectInstance(
+                                          msg->getObject(),
+                                          msg->getFedTime(),
+                                          (msg->getTag()).c_str(),
+                                          msg->getEventRetraction());
+            }
+            else {
+                fed_amb->removeObjectInstance(
+                                          msg->getObject(),
+                                          (msg->getTag()).c_str());
+            }
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("removeObjectInstance")
+        break ;
+
+      case Message::PROVIDE_ATTRIBUTE_VALUE_UPDATE:
+        try {
+            AttributeHandleSet *attributeSet = msg->getAHS();
+
+            
fed_amb->provideAttributeValueUpdate(msg->getObject(),*attributeSet);
+            delete attributeSet ;
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("provideAttributeValueUpdate")
+        break ;
+
+      case Message::REQUEST_RETRACTION: {
+
+      } break ;
+
+      case Message::REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:
+        try {
+            AttributeHandleSet *attributeSet = msg->getAHS();
+
+            fed_amb->
+                requestAttributeOwnershipAssumption(msg->getObject(),
+                                                    *attributeSet,
+                                                    (msg->getTag()).c_str());
+            delete attributeSet ;
+        }
+        
CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("requestAttributeOwnershipAssumption")
+        break ;
+
+      case Message::REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:
+        try {
+            AttributeHandleSet *attributeSet = msg->getAHS();
+
+            fed_amb->requestAttributeOwnershipRelease(
+                msg->getObject(),
+                *attributeSet,
+                (msg->getTag()).c_str());
+
+            delete attributeSet ;
+        }
+        
CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("requestAttributeOwnershipRelease")
+        break ;
+
+      case Message::ATTRIBUTE_OWNERSHIP_UNAVAILABLE:
+        try {
+            AttributeHandleSet *attributeSet = msg->getAHS();
+
+            fed_amb->attributeOwnershipUnavailable(msg->getObject(),
+                                                       *attributeSet);
+
+            delete attributeSet ;
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("attributeOwnershipUnavailable")
+        break ;
+
+      case Message::ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:
+        try {
+            AttributeHandleSet *attributeSet = msg->getAHS();
+
+            fed_amb->attributeOwnershipAcquisitionNotification(
+                msg->getObject(),
+                *attributeSet);
+
+            delete attributeSet ;
+        }
+        
CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("attributeOwnershipAcquisitionNotification")
+        break ;
+
+      case Message::ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION:
+        try {
+            AttributeHandleSet *attributeSet = msg->getAHS();
+
+            fed_amb->attributeOwnershipDivestitureNotification(
+                msg->getObject(),
+                *attributeSet);
+
+            delete attributeSet ;
+        }
+        
CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("attributeOwnershipDivestitureNotification")
+        break ;
+
+      case Message::CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION:
+        try {
+            AttributeHandleSet *attributeSet = msg->getAHS();
+
+            fed_amb->confirmAttributeOwnershipAcquisitionCancellation(
+                msg->getObject(),
+                *attributeSet);
+
+            delete attributeSet ;
+        }
+        
CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("confirmAttributeOwnershipAcquisitionCancellation")
+        break ;
+
+      case Message::INFORM_ATTRIBUTE_OWNERSHIP: 
+        try {
+            fed_amb->
+                informAttributeOwnership(msg->getObject(),
+                                         msg->getAttribute(),
+                                         msg->getFederate());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("informAttributeOwnership")
+        break ;
+
+      case Message::ATTRIBUTE_IS_NOT_OWNED:
+        try {
+            fed_amb->attributeIsNotOwned(msg->getObject(),
+                                                      msg->getAttribute());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("attributeIsNotOwned")
+        break ;
+
+      case Message::TIME_ADVANCE_GRANT:
+        try {
+            fed_amb->timeAdvanceGrant(msg->getFedTime());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("timeAdvanceGrant")
+        break ;
+
+      case Message::TIME_REGULATION_ENABLED:
+        try {
+            fed_amb->timeRegulationEnabled(msg->getFedTime());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("timeRegulationEnabled")
+        break ;
+
+      case Message::TIME_CONSTRAINED_ENABLED:
+        try {
+            fed_amb->timeConstrainedEnabled(msg->getFedTime());
+        }
+        CATCH_FEDERATE_AMBASSADOR_EXCEPTIONS("timeConstrainedEnabled")
+        break ;
+
+      default:
+        leave("RTI service requested by RTI is unknown.");
+    }
+}
+
+// $Id: RTIambPrivateRefs.cc,v 3.15 2008/11/06 14:28:58 gotthardp Exp $

Index: libRTI/RTIambPrivateRefs.hh
===================================================================
RCS file: /sources/certi/certi/libRTI/RTIambPrivateRefs.hh,v
retrieving revision 3.5
retrieving revision 3.6
diff -u -b -r3.5 -r3.6
--- libRTI/RTIambPrivateRefs.hh 29 May 2008 12:20:40 -0000      3.5
+++ libRTI/RTIambPrivateRefs.hh 6 Nov 2008 14:28:58 -0000       3.6
@@ -19,7 +19,7 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 // USA
 //
-// $Id: RTIambPrivateRefs.hh,v 3.5 2008/05/29 12:20:40 rousse Exp $
+// $Id: RTIambPrivateRefs.hh,v 3.6 2008/11/06 14:28:58 gotthardp Exp $
 // ----------------------------------------------------------------------------
 
 #include "RTI.hh"
@@ -37,6 +37,8 @@
 
     void processException(Message *);
     void executeService(Message *requete, Message *reponse);
+    void sendTickRequestStop();
+    void callFederateAmbassador(Message *msg) throw (RTIinternalError);
     void leave(const char *msg) throw (RTIinternalError);
 
        #ifdef _WIN32
@@ -57,4 +59,4 @@
     MessageBuffer msgBufSend,msgBufReceive ;
 };
 
-// $Id: RTIambPrivateRefs.hh,v 3.5 2008/05/29 12:20:40 rousse Exp $
+// $Id: RTIambPrivateRefs.hh,v 3.6 2008/11/06 14:28:58 gotthardp Exp $

Index: libRTI/RTIambassador.cc
===================================================================
RCS file: /sources/certi/certi/libRTI/RTIambassador.cc,v
retrieving revision 3.96
retrieving revision 3.97
diff -u -b -r3.96 -r3.97
--- libRTI/RTIambassador.cc     13 Oct 2008 09:38:08 -0000      3.96
+++ libRTI/RTIambassador.cc     6 Nov 2008 14:28:58 -0000       3.97
@@ -19,7 +19,7 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 // USA
 //
-// $Id: RTIambassador.cc,v 3.96 2008/10/13 09:38:08 gotthardp Exp $
+// $Id: RTIambassador.cc,v 3.97 2008/11/06 14:28:58 gotthardp Exp $
 // ----------------------------------------------------------------------------
 
 
@@ -282,11 +282,11 @@
     try {
         vers_RTI.send(privateRefs->socketUn,privateRefs->msgBufSend);
     }
-    catch (NetworkError) {
-        cout << "tick 1." << endl ;
-        cout << "LibRTI:: Catched NetworkError, throw RTIinternalError."
-             << endl ;
-        throw RTIinternalError("RTI::RTIambassador::tick_kernel (tick1) : 
NetworkError-->RTIinternalError");
+    catch (NetworkError &e) {
+        std::stringstream msg;
+        msg << "NetworkError in tick() while sending TICK_REQUEST: " << 
e._reason;
+
+        throw RTIinternalError(msg.str().c_str());
     }
 
     // Read response(s) from the local RTIA until Message::TICK_REQUEST is 
received.
@@ -294,287 +294,51 @@
         try {
             vers_Fed.receive(privateRefs->socketUn,privateRefs->msgBufReceive);
         }
-        catch (NetworkError) {
-            cout << "tick 2." << endl ;
-            cout << "LibRTI:: Catched NetworkError, throw RTIinternalError."
-                 << endl ;
-            throw RTIinternalError("RTI::RTIambassador::tick_kernel (tick2) : 
NetworkError-->RTIinternalError");
-        }
+        catch (NetworkError &e) {
+            std::stringstream msg;
+            msg << "NetworkError in tick() while receiving response: " << 
e._reason;
 
-        vers_RTI.setException(e_NO_EXCEPTION);
+            throw RTIinternalError(msg.str().c_str());
+        }
 
-        try {          
             //D.Mes( pdMessage, 'M', vers_Fed.type);
             vers_Fed.trace("RTI::RTIambassador::tick ");
                 
-            switch (vers_Fed.type) {
-
               // If the type is TICK_REQUEST, the __tick_kernel() has 
terminated.
-
-              case Message::TICK_REQUEST:
-                if (vers_Fed.getExceptionType() != e_NO_EXCEPTION)
+        if (vers_Fed.type == Message::TICK_REQUEST) {
+            if (vers_Fed.getExceptionType() != e_NO_EXCEPTION) {
+                // tick() may only throw exceptions defined in the HLA standard
+                // the RTIA is responsible for sending 'allowed' exceptions 
only
                     privateRefs->processException(&vers_Fed);
-                return RTI::Boolean(vers_Fed.getBoolean());
-
-              // Otherwise, the RTI calls a FederateAmbassador service.
-
-              case Message::SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:
-                
privateRefs->fed_amb->synchronizationPointRegistrationSucceeded((vers_Fed.getLabel()).c_str());
-                break ;
-
-              case Message::ANNOUNCE_SYNCHRONIZATION_POINT:
-                
privateRefs->fed_amb->announceSynchronizationPoint((vers_Fed.getLabel()).c_str(),(vers_Fed.getTag()).c_str());
-                break ;
-
-              case Message::FEDERATION_SYNCHRONIZED:
-                
privateRefs->fed_amb->federationSynchronized((vers_Fed.getLabel()).c_str());
-                break ;
-
-              case Message::INITIATE_FEDERATE_SAVE:
-                
privateRefs->fed_amb->initiateFederateSave((vers_Fed.getLabel()).c_str());
-                break ;
-
-              case Message::FEDERATION_SAVED:
-                privateRefs->fed_amb->federationSaved();
-                break ;
-
-              case Message::REQUEST_FEDERATION_RESTORE_SUCCEEDED:
-                privateRefs->fed_amb->requestFederationRestoreSucceeded(
-                    (vers_Fed.getLabel()).c_str());
-                break ;
-
-              case Message::REQUEST_FEDERATION_RESTORE_FAILED:
-                
privateRefs->fed_amb->requestFederationRestoreFailed((vers_Fed.getLabel()).c_str(),
-                                                        
(vers_Fed.getTag()).c_str());
-                break ;
-
-              case Message::FEDERATION_RESTORE_BEGUN:
-                privateRefs->fed_amb->federationRestoreBegun();
-                break ;
-
-              case Message::INITIATE_FEDERATE_RESTORE:
-                
privateRefs->fed_amb->initiateFederateRestore((vers_Fed.getLabel()).c_str(),
-                                                 vers_Fed.getFederate());
-                break ;
-
-              case Message::FEDERATION_RESTORED:
-                privateRefs->fed_amb->federationRestored();
-                break ;
-
-              case Message::FEDERATION_NOT_RESTORED:
-                privateRefs->fed_amb->federationNotRestored();
-                break ;
-
-              case Message::START_REGISTRATION_FOR_OBJECT_CLASS: {
-                  privateRefs->fed_amb->startRegistrationForObjectClass(
-                     vers_Fed.getObjectClass());
-              } break ;
-
-              case Message::STOP_REGISTRATION_FOR_OBJECT_CLASS: {
-                  privateRefs->fed_amb->
-                      
stopRegistrationForObjectClass(vers_Fed.getObjectClass());
-              } break ;
-
-              case Message::TURN_INTERACTIONS_ON: {
-                  
privateRefs->fed_amb->turnInteractionsOn(vers_Fed.getInteractionClass());
-              } break ;
-
-              case Message::TURN_INTERACTIONS_OFF: {
-                  
privateRefs->fed_amb->turnInteractionsOff(vers_Fed.getInteractionClass());
-              } break ;
-
-              case Message::DISCOVER_OBJECT_INSTANCE: {
-                  privateRefs->fed_amb->
-                      discoverObjectInstance(vers_Fed.getObject(),
-                                             vers_Fed.getObjectClass(),
-                                             vers_Fed.getName().c_str());
-              } break ;
-
-              case Message::REFLECT_ATTRIBUTE_VALUES: {
-                  G.Out(pdGendoc,"          tick_kernel call to 
reflectAttributeValues");
-                  AttributeHandleValuePairSet *attributes = 
vers_Fed.getAHVPS();
-                  if (vers_Fed.getBoolean())
-                     privateRefs->fed_amb->
-                         reflectAttributeValues(vers_Fed.getObject(),
-                                                *attributes,
-                                                vers_Fed.getFedTime(),
-                                                (vers_Fed.getTag()).c_str(),
-                                                vers_Fed.getEventRetraction());
-                  else
-                     privateRefs->fed_amb->
-                         reflectAttributeValues(vers_Fed.getObject(),
-                                                *attributes,
-                                                (vers_Fed.getTag()).c_str());
-                  delete attributes ;
-              } break ;
-
-              case Message::RECEIVE_INTERACTION:
-                  {
-                  ParameterHandleValuePairSet *parameters = 
vers_Fed.getPHVPS();
-                  if (vers_Fed.getBoolean())
-                      privateRefs->fed_amb->receiveInteraction(
-                                              vers_Fed.getInteractionClass(),
-                                              *parameters,
-                                              vers_Fed.getFedTime(),
-                                              (vers_Fed.getTag()).c_str(),
-                                              vers_Fed.getEventRetraction());
-                  else
-                      privateRefs->fed_amb->receiveInteraction(
-                                              vers_Fed.getInteractionClass(),
-                                              *parameters,
-                                              (vers_Fed.getTag()).c_str());
-
-                  delete parameters ;
-                  } break ;
-
-              case Message::REMOVE_OBJECT_INSTANCE: {
-                  if (vers_Fed.getBoolean()) {
-                      privateRefs->fed_amb->removeObjectInstance(
-                                                vers_Fed.getObject(),
-                                                vers_Fed.getFedTime(),
-                                                (vers_Fed.getTag()).c_str(),
-                                                vers_Fed.getEventRetraction());
                    }
-              else {
-                      privateRefs->fed_amb->removeObjectInstance(
-                                                vers_Fed.getObject(),
-                                                (vers_Fed.getTag()).c_str());
+            return RTI::Boolean(vers_Fed.getBoolean());
                    }
-              } break ;
-
-              case Message::PROVIDE_ATTRIBUTE_VALUE_UPDATE: {
-                  AttributeHandleSet *attributeSet = vers_Fed.getAHS();
 
-                  
privateRefs->fed_amb->provideAttributeValueUpdate(vers_Fed.getObject(),*attributeSet);
-                  delete attributeSet ;
-              } break ;
-
-              case Message::REQUEST_RETRACTION: {
-
-              } break ;
-
-              case Message::REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION: {
-                  AttributeHandleSet *attributeSet = vers_Fed.getAHS();
-
-                  privateRefs->fed_amb->
-                      requestAttributeOwnershipAssumption(vers_Fed.getObject(),
-                                                          *attributeSet,
-                                                          
(vers_Fed.getTag()).c_str());
-                  delete attributeSet ;
-              } break ;
-
-              case Message::REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE: {
-                  AttributeHandleSet *attributeSet = vers_Fed.getAHS();
-
-                  privateRefs->fed_amb->requestAttributeOwnershipRelease(
-                vers_Fed.getObject(),
-                *attributeSet,
-                (vers_Fed.getTag()).c_str());
-
-                  delete attributeSet ;
-              } break ;
-
-              case Message::ATTRIBUTE_OWNERSHIP_UNAVAILABLE: {
-                  AttributeHandleSet *attributeSet = vers_Fed.getAHS();
-
-                  
privateRefs->fed_amb->attributeOwnershipUnavailable(vers_Fed.getObject(),
-                                                             *attributeSet);
-
-                  delete attributeSet ;
-              } break ;
-
-              case Message::ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION: {
-                  AttributeHandleSet *attributeSet = vers_Fed.getAHS();
-
-                  
privateRefs->fed_amb->attributeOwnershipAcquisitionNotification(
-                vers_Fed.getObject(),
-                *attributeSet);
-
-                  delete attributeSet ;
-              } break ;
-
-              case Message::ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION: {
-                  AttributeHandleSet *attributeSet = vers_Fed.getAHS();
-
-                  
privateRefs->fed_amb->attributeOwnershipDivestitureNotification(
-                vers_Fed.getObject(),
-                *attributeSet);
-
-                  delete attributeSet ;
-              } break ;
-
-              case 
Message::CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION: {
-                  AttributeHandleSet *attributeSet = vers_Fed.getAHS();
-
-                  privateRefs->fed_amb->
-                          confirmAttributeOwnershipAcquisitionCancellation
-                          (vers_Fed.getObject(), *attributeSet);
-
-                  delete attributeSet ;
-              } break ;
-
-               case Message::INFORM_ATTRIBUTE_OWNERSHIP: {
-                  privateRefs->fed_amb->
-                      informAttributeOwnership(vers_Fed.getObject(),
-                                                   vers_Fed.getAttribute(),
-                                                   vers_Fed.getFederate());
-              } break ;
-
-              case Message::ATTRIBUTE_IS_NOT_OWNED: {
-                  
privateRefs->fed_amb->attributeIsNotOwned(vers_Fed.getObject(),
-                                                   vers_Fed.getAttribute());
-              } break ;
-
-              case Message::TIME_ADVANCE_GRANT: {
-                  
privateRefs->fed_amb->timeAdvanceGrant(vers_Fed.getFedTime());
-              } break ;
-
-              case Message::TIME_REGULATION_ENABLED:
-                
privateRefs->fed_amb->timeRegulationEnabled(vers_Fed.getFedTime());
-               break;
-             case Message::TIME_CONSTRAINED_ENABLED:
-                
privateRefs->fed_amb->timeConstrainedEnabled(vers_Fed.getFedTime());
-                break;
-
-              default: {
-                  privateRefs->leave("RTI service requested by RTI is 
unknown.");
+        try {
+            // Otherwise, the RTI calls a FederateAmbassador service.
+            privateRefs->callFederateAmbassador(&vers_Fed);
               }
+        catch (RTIinternalError) {
+            // RTIA awaits TICK_REQUEST_NEXT, terminate the tick() processing
+            privateRefs->sendTickRequestStop();
+            // ignore the response and re-throw the original exception
+            throw;
             }
 
+        try {
             // Request next callback from the RTIA
             Message tick_next;
             tick_next.type = Message::TICK_REQUEST_NEXT;
 
-            try {
                 tick_next.send(privateRefs->socketUn, privateRefs->msgBufSend);
             }
-            catch (NetworkError) {
-                cout << "tick 3." << endl ;
-                cout << "LibRTI:: Catched NetworkError, throw 
RTIinternalError."
-                     << endl ;
-                throw RTIinternalError("RTI::RTIambassador::__tick_kernel 
(tick3) : NetworkError-->RTIinternalError");
-            }
-        }
-        catch (InvalidFederationTime &e) {
-            vers_RTI.setException(e_InvalidFederationTime, e._reason);
-            throw ;
-        }
-        catch (TimeAdvanceWasNotInProgress &e) {
-            vers_RTI.setException(e_TimeAdvanceWasNotInProgress, e._reason);
-            throw ;
-        }
-        catch (FederationTimeAlreadyPassed &e) {
-            vers_RTI.setException(e_FederationTimeAlreadyPassed, e._reason);
-        }
-        catch (FederateInternalError &e) {
-            vers_RTI.setException(e_FederateInternalError, e._reason);
-            throw ;
-        }
-        catch (Exception &e) {
-            vers_RTI.setException(e_RTIinternalError, e._reason);
-            throw ;
-        }
+        catch (NetworkError &e) {
+            std::stringstream msg;
+            msg << "NetworkError in tick() while sending TICK_REQUEST_NEXT: " 
<< e._reason;
+
+            throw RTIinternalError(msg.str().c_str());
     }
+    } // while(1)
 }
 
 // ----------------------------------------------------------------------------
@@ -3064,4 +2828,4 @@
     privateRefs->executeService(&req, &rep);
 }
 
-// $Id: RTIambassador.cc,v 3.96 2008/10/13 09:38:08 gotthardp Exp $
+// $Id: RTIambassador.cc,v 3.97 2008/11/06 14:28:58 gotthardp Exp $




reply via email to

[Prev in Thread] Current Thread [Next in Thread]