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 + -
显示快捷键?