📄 federation.cc~
字号:
RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember. this->check(federate_handle); root->Interactions->broadcastInteraction(federate_handle, interaction, parameter_handles, parameter_values, list_size, time, tag); D.Out(pdRequest, "Federation %d: Broadcasted Interaction %d from Federate " "%d nb params %d.", handle, interaction, federate_handle, list_size); for (int i=0 ; i < list_size ; i++) D.Out(pdRequest, " Param %d Value %s", parameter_handles[i], parameter_values[i]);}// ----------------------------------------------------------------------------// deleteObjectvoidFederation::deleteObject(FederateHandle federate, ObjectHandle id, const char *tag) throw (FederateNotExecutionMember, DeletePrivilegeNotHeld, ObjectNotKnown, SaveInProgress, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember. this->check(federate); D.Out(pdRegister, "Federation %d: Federate %d destroys object %d.", this->handle, federate, id); root->ObjectClasses->deleteObject(federate, id, tag);}// ----------------------------------------------------------------------------//! registerSynchronization.voidFederation::registerSynchronization(FederateHandle federate, const char *label, const char *tag) throw (FederateNotExecutionMember, FederationAlreadyPaused, SaveInProgress, RestoreInProgress, RTIinternalError){ D.Out(pdTerm, "check federate"); this->check(federate); // It may throw FederateNotExecutionMember. D.Out(pdTerm, "check federate done"); if ((label == NULL) || (strlen(label) > MAX_USER_TAG_LENGTH)) throw RTIinternalError("Bad pause label(null or too long)."); // Verify label does not already exists D.Out(pdTerm, "verify map"); std::map<const char *, const char *>::const_iterator i ; i = synchronizationLabels.begin(); for (; i != synchronizationLabels.end(); i++) { if (!strcmp((*i).first, label)) { throw FederationAlreadyPaused(); // Label already pending. } }D.Out(pdTerm, "synchronizationLabels insert"); // If not already in pending labels, insert to list. synchronizationLabels.insert(pair<const char *, const char *>(strdup(label), strdup(tag)));D.Out(pdTerm, "add label"); // Add label to each federate (may throw RTIinternalError). list<Federate *>::iterator j ; for (j = begin(); j != end(); j++) { if((*j)==NULL)D.Out(pdTerm, "pointeur null"); else D.Out(pdTerm, "pointeur non null"); (*j)->addSynchronizationLabel(label); } D.Out(pdTerm, "Federation %d is now synchronizing for label %s.", label, handle);}// ----------------------------------------------------------------------------voidFederation::broadcastSynchronization(FederateHandle federate, const char *label, const char *tag) throw (RTIinternalError){ this->check(federate); // It may throw FederateNotExecutionMember. if ((label == NULL) || (strlen(label) > MAX_USER_TAG_LENGTH)) throw RTIinternalError("Bad pause label(null or too long)."); // broadcast announceSynchronizationPoint() to all federates in federation. NetworkMessage msg ; msg.type = m_ANNOUNCE_SYNCHRONIZATION_POINT ; msg.federate = federate ; msg.federation = handle ; msg.setLabel(label); msg.setTag(tag); broadcastAnyMessage(&msg, 0);}// ----------------------------------------------------------------------------//! Return a pointer of the Federate whose Handle is theHandle, if found.Federate*Federation::getByHandle(FederateHandle federate_handle) const throw (FederateNotExecutionMember){ for (list<Federate *>::const_iterator i = begin(); i != end(); i++) { if ((*i)->getHandle() == federate_handle) return (*i); } throw FederateNotExecutionMember("Federate Handle not found.");}// ----------------------------------------------------------------------------//! Return a pointer of the Federate whose Name is theName, if found.Federate*Federation::getByName(const char *federate_name) const throw (FederateNotExecutionMember){ for (list<Federate *>::const_iterator i = begin(); i != end(); i++) { if (strcmp((*i)->getName(), federate_name) == 0) return (*i); } throw FederateNotExecutionMember("Federate Name not found.");}// ----------------------------------------------------------------------------//! Return a brand new Federate Handle./*! Throw an exception if there are no more handles left(MAX_FEDERATEHANDLE). */FederateHandleFederation::getNewHandle(void) throw (RTIinternalError){ if (nextFederateHandle > MAX_FEDERATEHANDLE) { D.Out(pdExcept, "Federation %d: Max Federate Handle count reached.", handle); throw RTIinternalError("Max Federate Handle reached."); } FederateHandle new_handle = nextFederateHandle ; nextFederateHandle++ ; return new_handle ;}// ----------------------------------------------------------------------------// empty/*! Return true if there are no Federates left in the Federation, else throw FederatesCurrentlyJoined.*/boolFederation::empty(void) const throw (FederatesCurrentlyJoined){ if (list<Federate *>::empty()) return true ; else throw FederatesCurrentlyJoined();}// ----------------------------------------------------------------------------// check/*! Return true if the Federate is part of the Federation, else throw an exception.*/boolFederation::check(FederateHandle federate_handle) const throw (FederateNotExecutionMember){ for (list<Federate *>::const_iterator i = begin(); i != end(); i++) { if ((*i)->getHandle() == federate_handle) return true ; } throw FederateNotExecutionMember();}// ----------------------------------------------------------------------------// killFederate/*! This Method tries to remove all references to this Federate in the Federation. To be used when a Federate is supposed to have crashed.*/voidFederation::kill(FederateHandle federate) throw (){ // NOTE: Connection to the federate is already closed. D.Out(pdInit, "Killing Federate %d.", federate); // is regulator ? try { removeRegulator(federate); D.Out(pdInit, "Regulator Federate %d removed...", federate); } catch (Exception &e) {} // is constrained ? try { removeConstrained(federate); D.Out(pdInit, "Constrained Federate %d removed...", federate); } catch (Exception &e) {} // Supprime les references au federe pour les classes d'objets D.Out(pdInit, "Federate %d removed from the Root Object tree...", federate); root->ObjectClasses->killFederate(federate); // Supprime les references au federe pour les classes d'interactions. D.Out(pdInit, "Federate %d removed from the Root Inteaction tree...", federate); root->Interactions->killFederate(federate); // delete from federations list try { remove(federate); D.Out(pdInit, "Federate %d removed...", federate); } catch (Exception &e) {}}// ----------------------------------------------------------------------------// publishInteractionvoidFederation::publishInteraction(FederateHandle federate, InteractionClassHandle interaction, bool pub) throw (InteractionClassNotDefined, FederateNotExecutionMember, SaveInProgress, SecurityError, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember. this->check(federate); // It may throw InteractionClassNotDefined root->Interactions->publish(federate, interaction, pub); D.Out(pdRequest, "Federation %d: Federate %d has(un)published Interaction %d.", handle, federate, interaction);}// ----------------------------------------------------------------------------// publishObjectvoidFederation::publishObject(FederateHandle federate, ObjectClassHandle object, AttributeHandle *attributes, UShort list_size, bool pub) throw (ObjectClassNotDefined, AttributeNotDefined, FederateNotExecutionMember, SaveInProgress, SecurityError, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember. this->check(federate); // It may throw *NotDefined root->ObjectClasses->publish(federate, object, attributes, list_size, pub); D.Out(pdRegister, "Federation %d: Federate %d(un)publishes %d attrib. of ObjClass %d.", handle, federate, list_size, object);}// ----------------------------------------------------------------------------// registerObjectObjectHandleFederation::registerObject(FederateHandle federate, ObjectClassHandle class_handle, ObjectName object_name) throw (FederateNotExecutionMember, FederateNotPublishing, ObjectAlreadyRegistered, ObjectClassNotDefined, SaveInProgress, RestoreInProgress, RTIinternalError){ // Allocate new ID. if (nextObjectId > MAX_OBJECTID) { D.Out(pdError, "RTIinternalError : nextObjectId = %d, MAX = %d.", nextObjectId, MAX_OBJECTID); throw RTIinternalError("Too many IDs requested."); } ObjectHandle new_id = nextObjectId ; nextObjectId++ ; D.Out(pdRegister, "Federation %d: Federate %d registering Object %d of Class %d.", handle, federate, new_id, class_handle); // Register Object. root->ObjectClasses->registerInstance(federate, class_handle, new_id, object_name); D.Out(pdDebug, "suite"); return new_id ;}// ----------------------------------------------------------------------------// removeFederate/*! BUG: Currently does not check if Federate owns attributes. The Federate Object is deleted.*/voidFederation::remove(FederateHandle federate_handle) throw (FederateOwnsAttributes, FederateNotExecutionMember){ for (list<Federate *>::iterator i = begin(); i != end(); i++) { if ((*i)->getHandle() == federate_handle) { // BUG: RemoveFederate: Should see if Federate owns attributes delete (*i); erase(i); D.Out(pdInit, "Federation %d: Removed Federate %d.", handle, federate_handle); return ; } } D.Out(pdExcept, "Federation %d could not remove unknown federate %d.", handle, federate_handle); throw FederateNotExecutionMember();}// ----------------------------------------------------------------------------//! Set Federate's IsConstrained to false.voidFederation::removeConstrained(FederateHandle federate_handle) throw (FederateNotExecutionMember, SaveInProgress, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember Federate *federate = getByHandle(federate_handle); if (federate->isConstrained() == false) { D.Out(pdExcept, "Federate %d was not constrained.", federate_handle); throw RTIinternalError("Time constrained not enabled."); } federate->setConstrained(false); D.Out(pdTerm, "Federation %d: Federate %d is not constrained anymore.", handle, federate_handle);}// ----------------------------------------------------------------------------//! Remove the Federate from the Regulators' list.voidFederation::removeRegulator(FederateHandle federate_handle) throw (FederateNotExecutionMember, SaveInProgress, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember Federate *federate = getByHandle(federate_handle); // It may throw RTIinternalError if Federate was not regulators. regulators.remove(federate_handle); federate->setRegulator(false); D.Out(pdTerm, "Federation %d: Federate %d is not a regulator anymore.", handle, federate_handle); NetworkMessage msg ; msg.type = m_SET_TIME_REGULATING ; msg.exception = e_NO_EXCEPTION ; msg.federation = handle ; msg.federate = federate_handle ; msg.regulator = RTI_FALSE ; msg.date = 0 ; broadcastAnyMessage(&msg, 0);}// ----------------------------------------------------------------------------//! Return 'IDCount' unique IDs, ranging from FirstID to LastID.voidFederation::requestId(ObjectHandlecount id_count, ObjectHandle &first_id, ObjectHandle &last_id) throw (TooManyIDsRequested){ // BUG: Should note a security threat for this service. if (nextObjectId + id_count - 1 > MAX_OBJECTID) throw TooManyIDsRequested(); first_id = nextObjectId ; last_id = nextObjectId + id_count - 1 ; D.Out(pdInit, "Federation %d returns %d new IDs starting at %d.", handle, id_count, first_id); nextObjectId = last_id + 1 ;}// ----------------------------------------------------------------------------//! unregisterSynchronization.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -