federationmanagement.cc
来自「分布式仿真 开放源码」· CC 代码 · 共 646 行 · 第 1/2 页
CC
646 行
// ----------------------------------------------------------------------------// CERTI - HLA RunTime Infrastructure// Copyright (C) 2002, 2003 ONERA//// This file is part of CERTI//// CERTI is free software ; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation ; either version 2 of the License, or// (at your option) any later version.//// CERTI is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY ; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program ; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA//// $Id: FederationManagement.cc,v 3.14 2004/03/04 20:19:04 breholee Exp $// ----------------------------------------------------------------------------#include <config.h>#include "FederationManagement.hh"#include "TimeManagement.hh"#include "PrettyDebug.hh"#include <list>#include <cstdio>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <stdlib.h>#include <assert.h>using std::list ;namespace certi {namespace rtia {static pdCDebug D("RTIA_FM", "(RTIA FM) ");// ----------------------------------------------------------------------------//! FederationManagement.FederationManagement::FederationManagement(Communications *GC) : savingState(false), restoringState(false){ comm = GC ; tm = NULL ; _numero_federation = 0 ; federate = 0 ; _fin_execution = RTI_FALSE ; _est_createur_federation = RTI_FALSE ; _est_membre_federation = RTI_FALSE ; _nom_federation[0] = 0 ; _nom_federe[0] = 0 ;}// ----------------------------------------------------------------------------//! Destructor.FederationManagement::~FederationManagement(){ TypeException e ; if (_est_membre_federation) { resignFederationExecution(DELETE_OBJECTS, e); } // BUG: On devrait pouvoir quitter une federation que l'on a cree // sans la detruire en partant. // a-t-on avertit les autres federes de notre depart et donc // de la destruction de notre objet par RemoveObject(HARZI) // car le Remove Object ne diffuse pas le message if (_est_createur_federation) { cout << "RTIA: Staying active to destroy federation..." << endl ; destroyFederationExecution(_nom_federation, e); while (e != e_NO_EXCEPTION) { sleep(1); destroyFederationExecution(_nom_federation, e); } cout << "RTIA: Federation destroyed" << endl ; }}// ----------------------------------------------------------------------------//! createFederationExecution.voidFederationManagement::createFederationExecution(const char *theName, TypeException &e){ NetworkMessage requete, reponse ; D.Out(pdInit, "Creating Federation %s.", theName); e = e_NO_EXCEPTION ; // BUG: pour l'instant, le federe ne peut creer q'une federation if (_est_createur_federation || _est_membre_federation) e = e_RTIinternalError ; if (e == e_NO_EXCEPTION) { requete.type = NetworkMessage::CREATE_FEDERATION_EXECUTION ; strcpy(requete.federationName, theName); comm->sendMessage(&requete); comm->waitMessage(&reponse, NetworkMessage::CREATE_FEDERATION_EXECUTION, federate); if (reponse.exception == e_NO_EXCEPTION) { strcpy(_nom_federation, theName); _numero_federation = reponse.federation ; _est_createur_federation = RTI_TRUE ; D.Out(pdInit, "est createur"); } else { e = reponse.exception ; D.Out(pdInit, "deja cree"); } }}// ----------------------------------------------------------------------------//! destroyFederationExecution.voidFederationManagement::destroyFederationExecution(const char *theName, TypeException &e){ NetworkMessage requete, reponse ; D.Out(pdInit, "Destroy Federation %s.", theName); e = e_NO_EXCEPTION ; // BUG: On devrait pouvoir detruire une federation meme si on est // pas le createur. if (!_est_createur_federation || strcmp(theName, _nom_federation)) e = e_FederationExecutionDoesNotExist ; if (e == e_NO_EXCEPTION) { requete.type = NetworkMessage::DESTROY_FEDERATION_EXECUTION ; requete.federation = _numero_federation ; requete.federate = federate ; strcpy(requete.federationName, theName); printf("EMISSION DE LA REQUETE\n"); comm->sendMessage(&requete); printf("ATTENTE DE LA REPONSE\n"); comm->waitMessage(&reponse, NetworkMessage::DESTROY_FEDERATION_EXECUTION, federate); if (reponse.exception == e_NO_EXCEPTION) { _nom_federation[0] = 0 ; _numero_federation = 0 ; _est_createur_federation = RTI_FALSE ; _fin_execution = RTI_TRUE ; } else e = reponse.exception ; }}// ----------------------------------------------------------------------------//! joinFederationExecution.FederateHandleFederationManagement::joinFederationExecution(const char *Federate, const char *Federation, TypeException &e){ NetworkMessage requete, reponse ; int i, nb ; D.Out(pdInit, "Join Federation %s as %s.", Federation, Federate); e = e_NO_EXCEPTION ; if (_est_createur_federation && strcmp(Federation, _nom_federation)) e = e_RTIinternalError ; if (_est_membre_federation) e = e_FederateAlreadyExecutionMember ; if (e == e_NO_EXCEPTION) { requete.type = NetworkMessage::JOIN_FEDERATION_EXECUTION ; strcpy(requete.federationName, Federation); strcpy(requete.federateName, Federate); requete.bestEffortAddress = comm->getAddress(); requete.bestEffortPeer = comm->getPort(); comm->sendMessage(&requete); // On attend la reponse du RTIG(de n'importe quel federe) comm->waitMessage(&reponse, NetworkMessage::JOIN_FEDERATION_EXECUTION, 0); // Si c'est positif, cette reponse contient le nombre de regulateurs. // On attend alors un message NULL de chacun d'eux. if (reponse.exception == e_NO_EXCEPTION) { strcpy(_nom_federation, Federation); strcpy(_nom_federe, Federate); _numero_federation = reponse.federation ; federate = reponse.federate ; tm->MyFederateNumber = reponse.federate ;#ifdef FEDERATION_USES_MULTICAST // creation du socket pour la communication best-effort comm->CreerSocketMC(reponse.AdresseMulticast, MC_PORT);#endif nb = reponse.numberOfRegulators ; for (i=0 ; i<nb ; i++) { comm->waitMessage(&reponse, NetworkMessage::MESSAGE_NULL, 0); assert(tm != NULL); tm->insert(reponse.federate, reponse.date); } _est_membre_federation = RTI_TRUE ; return(federate); } else e = reponse.exception ; } return(0);}// -------------------------------// -- resignFederationExecution --// -------------------------------voidFederationManagement::resignFederationExecution(ResignAction, TypeException &e){ NetworkMessage msg ; TypeException exception = e_NO_EXCEPTION ; e = e_NO_EXCEPTION ; D.Out(pdInit, "Resign Federation."); if (!_est_membre_federation) e = e_FederateNotExecutionMember ; if (e == e_NO_EXCEPTION) { tm->StopperAvanceTemps(); if (tm->requestRegulateurState() == RTI_TRUE) tm->setTimeRegulating(RTI_FALSE, exception); msg.type = NetworkMessage::RESIGN_FEDERATION_EXECUTION ; msg.federation = _numero_federation ; msg.federate = federate ; comm->sendMessage(&msg); _est_membre_federation = RTI_FALSE ; _numero_federation = 0 ; federate = 0 ; // BUG: Voir DestroyFederation ou ~GF. if (!_est_createur_federation) _fin_execution = RTI_TRUE ; }}// ----------------------------------------------------------------------------//! Register synchronization.voidFederationManagement::registerSynchronization(const char *label, const char *tag, TypeException &e){ D.Out(pdProtocol, "RegisterSynchronization."); assert(label != NULL); e = e_NO_EXCEPTION ; list<char *>::const_iterator i = synchronizationLabels.begin(); bool exists = false ; for (; i != synchronizationLabels.end(); i++) { if (!strcmp((*i), label)) { e = e_FederationAlreadyPaused ; // Label already pending. exists = true ; break ; } } if (!exists) synchronizationLabels.push_back(strdup(label)); if (!_est_membre_federation) e = e_FederateNotExecutionMember ; if (e == e_NO_EXCEPTION) { NetworkMessage req ; req.type = NetworkMessage::REGISTER_FEDERATION_SYNCHRONIZATION_POINT ; req.federation = _numero_federation ; req.federate = federate ; req.setLabel(label); req.setTag(tag); comm->sendMessage(&req); }}// ----------------------------------------------------------------------------//! Unregister synchronization.voidFederationManagement::unregisterSynchronization(const char *label,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?