[Top][All Lists]
[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 $
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [certi-cvs] certi RTIA/RTIA_federate.cc RTIA/Statistics.cc ...,
certi-cvs <=