Back to index

salome-kernel  6.5.0
Functions
TestMPIContainer.cxx File Reference
#include "utilities.h"
#include <iostream>
#include <unistd.h>
#include <string>
#include <SALOMEconfig.h>
#include "Basics_Utils.hxx"
#include "Utils_ORB_INIT.hxx"
#include "Utils_SINGLETON.hxx"
#include "SALOME_NamingService.hxx"
#include "OpUtil.hxx"

Go to the source code of this file.

Functions

int main (int argc, char *argv[])

Function Documentation

int main ( int  argc,
char *  argv[] 
)

Definition at line 45 of file TestMPIContainer.cxx.

{

  // Initializing omniORB
  ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
  CORBA::ORB_var &orb = init( argc , argv ) ;
  //  SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
    
  BEGIN_OF(argv[0])
  try{

    int status;

    if( argc != 3 || strcmp(argv[1],"-np") ){
      std::cout << "Usage: TestMPIContainer -np nbproc" << std::endl;
      exit(0);
    }

    // Obtain a reference to the root POA
    CORBA::Object_var obj = orb->resolve_initial_references("RootPOA") ;
    PortableServer::POA_var poa = PortableServer::POA::_narrow(obj) ;

    // Use Name Service to find container
    SALOME_NamingService NS(orb) ;
    std::string containerName = "/Containers/" ;
    std::string hostName = Kernel_Utils::GetHostname();
    containerName += hostName + "/MPIFactoryServer_" + argv[2];

    std::string dirn(getenv("KERNEL_ROOT_DIR"));
    dirn += "/lib/salome/libSalomeTestMPIComponentEngine.so";
    
    // Try to resolve MPI Container
    obj = NS.Resolve(containerName.c_str()) ;
    Engines::MPIContainer_var iGenFact = Engines::MPIContainer::_narrow(obj);

    if(CORBA::is_nil(iGenFact)){

      // Launch MPI Container
      std::string cmd("mpirun -np ");
      cmd += argv[2];
      cmd += " ";
      cmd += getenv("KERNEL_ROOT_DIR");
      cmd += "/bin/salome/SALOME_MPIContainer MPIFactoryServer_";
      cmd += argv[2];
      cmd += " &";
      MESSAGE(cmd);
      status = system(cmd.c_str());
      if (status == -1) {
        INFOS("TestMPIContainer launch MPI Container failed (system command status -1)") ;
      }
      else if (status == 217) {
        INFOS("TestMPIContainer launch MPI Container failed (system command status 217)") ;
      }
    
      // Try to resolve MPI Container
      int it = 0;
      do{
        sleep(1);
        obj = NS.Resolve(containerName.c_str()) ;
        iGenFact = Engines::MPIContainer::_narrow(obj);
        MESSAGE("Waiting for MPI Container " << containerName << " : it = " << it );
      }while( CORBA::is_nil(iGenFact) && (it++<15) );

    }

    if(CORBA::is_nil(iGenFact)){
      MESSAGE("launching container failed");
      exit(1);
    }


    Engines::TestMPIComponent_var m1;

//     for (int iter = 0; iter < 1 ; iter++){
//       MESSAGE("----------------------------------------------------" << iter);   
    obj = iGenFact->load_impl("TestMPIComponent",dirn.c_str());

    INFOS("Get Handle on MPI Component");
    m1 = Engines::TestMPIComponent::_narrow(obj);
    if(CORBA::is_nil(m1)){
      INFOS("getting handle on MPI component failed");
    }
    else{ 
      m1->Coucou(1L);
// //   sleep(5);
      INFOS("Unload MPI Component");
      iGenFact->remove_impl(m1) ;
    }
//     }
//     // Clean-up.
// //     iGenFact->finalize_removal() ;
// //     sleep(5);
    iGenFact->Shutdown();
//     INFOS("shut down corba server for Test MPI Container");
//     orb->destroy();
  }
  catch(CORBA::COMM_FAILURE& ex) {
    INFOS("Caught system exception COMM_FAILURE -- unable to contact the object.");
  }
  catch(CORBA::SystemException&) {
    INFOS("Caught a CORBA::SystemException.");
  }
  catch(CORBA::Exception&) {
    INFOS("Caught CORBA::Exception.");
  }
  catch(...) {
    INFOS("Caught unknown exception.");
  }

  END_OF(argv[0]);
  //  delete myThreadTrace;
  return 0 ;
}

Here is the call graph for this function: