]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
Use PaCO++ event service to synchronise port creation
authorribes <ribes>
Thu, 26 Mar 2009 14:07:19 +0000 (14:07 +0000)
committerribes <ribes>
Thu, 26 Mar 2009 14:07:19 +0000 (14:07 +0000)
src/DSC/ParallelDSC/Param_Double_Port_provides_i.cxx
src/DSC/ParallelDSC/Param_Double_Port_provides_i.hxx
src/ParallelContainer/SALOME_ParallelContainerProxy_i.cxx

index 06eecd118b7a40f3d2feb76fcea7d5e0d1885afa..4484eba24d3d3ab2d568fd55c196d0a5aa94352f 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <iostream>
 #include <string>
+#include <sstream>
 
 #include "Param_Double_Port_provides_i.hxx"
 
@@ -168,28 +169,57 @@ Param_Double_Port_provides_i::init_port(Engines_ParallelDSC_i * par_compo,
   GaBro * dislib_gabro = (GaBro *) method_ptr->getDistLibArg("param_results", "out");
   dislib_gabro->setEltSize(sizeof(CORBA::Double));
 
-  com->paco_barrier();
-
   // Enregistement du port 
-  for (int i = 0; i < totalNode; i++) {
+  for (int i = 0; i < totalNode; i++) 
+  {
+    std::ostringstream node_number;
+    node_number << i;
+    std::string event_name("AddNode");
+    event_name += node_number.str();
+    std::string tag_name = proxy_ior;
+
     if (i == rank) {
       std::cerr << "Adding node of processor : " << i << std::endl;
       par_compo->add_parallel_provides_node_port(Ports::Port_PaCO::_narrow(port->_this()), port_name.c_str());
       port->_remove_ref();
+      par_compo->InterfaceParallel_impl::_proxy->send_event(event_name.c_str(), tag_name.c_str());
     }
-    com->paco_barrier();
+
+    par_compo->wait_event(event_name.c_str(), tag_name.c_str());
   }
 
   // On démarre l'objet parallèle
-  if (rank == 0) {
+  std::string event_name("StartingProxy");
+  std::string tag_name = proxy_ior;
+  if (rank == 0) 
+  {
     proxy_node->start();
-    com->paco_barrier();
+    par_compo->InterfaceParallel_impl::_proxy->send_event(event_name.c_str(), tag_name.c_str());
   }
-  else
-    com->paco_barrier();
   return port;
 }
 
+void
+Param_Double_Port_provides_i::wait_init_port(Engines_ParallelDSC_i * par_compo, 
+                                            std::string port_name,
+                                            CORBA::ORB_ptr orb)
+{
+  int rank = par_compo->getMyRank();
+  int totalNode = par_compo->getTotalNode();
+  // Enregistement du port 
+  for (int i = 0; i < totalNode; i++) 
+  {
+    std::ostringstream node_number;
+    node_number << i;
+    std::string event_name("WaitingNode");
+    event_name += node_number.str();
+    std::string tag_name = (char * ) par_compo->get_proxy(port_name.c_str());
+    if (i == rank) 
+      par_compo->InterfaceParallel_impl::_proxy->send_event(event_name.c_str(), tag_name.c_str());
+    par_compo->wait_event(event_name.c_str(), tag_name.c_str());
+  }
+}
+
 void 
 Param_Double_Port_provides_i::put(const Ports::Param_Double_Port::seq_double & param_data)
 {
index 3eba98b21edcc5a95403cdb977ad9bf000497d59..7a01fc56cb18fed8d04ee5021f77029c130e68c4 100644 (file)
@@ -50,6 +50,10 @@ class Param_Double_Port_provides_i :
                                                    std::string port_name,
                                                    CORBA::ORB_ptr orb);
 
+    // Méthode temporaire en attendant d'avoir des méthodes parallèles bien synchronisé
+    static void wait_init_port(Engines_ParallelDSC_i * par_compo, 
+                              std::string port_name,
+                              CORBA::ORB_ptr orb);
   private:
     // Buffers pour la réception et l'envoi
     Ports::Param_Double_Port::seq_double * _seq_data;
index f6eb80b37258c57aae8d47025b1575c43105a037..a80d51f08e3decb7f834e56f3cab7173f00717b5 100644 (file)
@@ -194,6 +194,11 @@ Container_proxy_impl_final::load_component_Library(const char* componentName)
     }
     else
     {
+      MESSAGE("Error in importing Cpp component : " << impl_name);
+#ifndef WIN32
+      MESSAGE("dlerror() result is : " << dlerror());
+#endif
+
       MESSAGE("Try to import Python component "<<componentName);
       Py_ACQUIRE_NEW_THREAD;
       PyObject *mainmod = PyImport_AddModule("__main__");